#android #opengl-es-2.0
#Android #opengl-es-2.0
Вопрос:
Я пытаюсь отобразить свой файл .obj, но получаю только пустой экран. Код чтения файла протестирован, файл .obj содержит объект с центром в координатах 0,0. Вопрос касается только кода GLES20. Не могли бы вы помочь разобраться, что не так?
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.opengl.GLES20;
import java.util.Hashtable;
import java.util.ArrayList;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.nio.FloatBuffer;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.util.Log;
public class MyGLSurfaceView extends GLSurfaceView implements GLSurfaceView.Renderer
{
private Context context;
private Hashtable<String, ArrayList<Float>> obj;
public MyGLSurfaceView(Context context)
{
super(context);
this.context = context;
setEGLContextClientVersion(2);
setRenderer(this);
}
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
obj = new Hashtable<String, ArrayList<Float>>();
try
{
BufferedReader reader = new BufferedReader(
new InputStreamReader(context.getAssets().open("calculator.obj")));
ArrayList<Float> vertex = new ArrayList<Float>();
String name = null;
String line = null;
while ((line = reader.readLine()) != null)
{
if (line.startsWith("v "))
{
String[] parts = line.substring(2).trim().split("\s ");
vertex.add(Float.valueOf(Float.valueOf(parts[0]).floatValue()));
vertex.add(Float.valueOf(Float.valueOf(parts[1]).floatValue()));
vertex.add(Float.valueOf(Float.valueOf(parts[2]).floatValue()));
}
if (line.startsWith("f "))
{
String[] parts = line.substring(2).trim().split("\s ");
obj.get(name).add(vertex.get(Integer.valueOf(parts[0]).intValue() - 1));
obj.get(name).add(vertex.get(Integer.valueOf(parts[1]).intValue() - 1));
obj.get(name).add(vertex.get(Integer.valueOf(parts[2]).intValue() - 1));
}
if (line.startsWith("g "))
{
name = line.substring(2).trim();
obj.put(name, new ArrayList<Float>());
}
}
reader.close();
}
catch (Exception e)
{
System.exit(0);
}
int i;
ByteBuffer fByteBuffer = ByteBuffer.allocateDirect(obj.get("calculator").size() * 4);
fByteBuffer.order(ByteOrder.nativeOrder());
FloatBuffer faces = fByteBuffer.asFloatBuffer();
for (i = 0; i < obj.get("calculator").size(); i )
faces.put(obj.get("calculator").get(i).floatValue());
faces.position(0);
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES20.glClearDepthf(1.0f);
int index[] = new int[1];
GLES20.glGenBuffers(1, index, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, index[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, faces.capacity(), faces, GLES20.GL_STATIC_DRAW);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, faces.capacity() / 3);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glFlush();
}
public void onSurfaceChanged(GL10 gl, int width, int height)
{
GLES20.glViewport(0, 0, width, height);
}
public void onDrawFrame(GL10 gl)
{
}
}
Комментарии:
1. В вашем коде нет ничего, что указывало бы на то, что вы используете шейдерную программу.
2. Не могли бы вы помочь с шейдерами? Можно ли избежать шейдеров и использовать только класс GLES20?
3. Нет, вы должны использовать шейдеры с GLES 2. Взгляните сюда, чтобы начать работу с шейдерами: learnopengles.com/android-lesson-one-getting-started
4. Это еще одна кривая обучения, изучающая шейдеры, но в долгосрочной перспективе это того стоит. Для простого 2D-рендеринга его очень легко подобрать.