Открыть GL ES 2.0 — пустой экран

#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-рендеринга его очень легко подобрать.