Учебник OpenGL ES для Android, похоже, не работает

Я следил за учебником на http://developer.android.com/resources/tutorials/opengl/opengl-es20.html для OpenGL ES на android. Я добрался до раздела «Применить проекцию и вид с камеры», но мне всегда кажется, что экран пустой без треугольника, предыдущий раздел работал отлично. Я также попытался просто скопировать и вставить весь учебник в свой код, но получил тот же результат. Изменение строки:

gl_Position = uMVPMatrix * vPosition;

to:

gl_Position = vPosition;

возвращает приложение в первый раздел (треугольник растягивается в зависимости от ориентации экрана). Есть идеи, в чем проблема? Вот код, который у меня есть на тот случай, если я что-то пропустил:

public class GLTest20Renderer implements Renderer {
    private final String vertexShaderCode = 
        // This matrix member variable provides a hook to manipulate
        // the coordinates of the objects that use this vertex shader
        "uniform mat4 uMVPMatrix;   \n" +

        "attribute vec4 vPosition;  \n" +
        "void main(){               \n" +

        // the matrix must be included as a modifier of gl_Position
        " gl_Position = uMVPMatrix * vPosition; \n" +

        "}  \n";

    private final String fragmentShaderCode = 
        "precision mediump float;  \n" +
        "void main(){              \n" +
        " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n" +
        "}                         \n";


    private FloatBuffer triangleVB;

    private int mProgram;
    private int maPositionHandle;

    private int muMVPMatrixHandle;
    private float[] mMVPMatrix = new float[16];
    private float[] mMMatrix = new float[16];
    private float[] mVMatrix = new float[16];
    private float[] mProjMatrix = new float[16];

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

        initShapes();

        int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

        mProgram = GLES20.glCreateProgram();             // create empty OpenGL Program
        GLES20.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
        GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
        GLES20.glLinkProgram(mProgram);                  // creates OpenGL program executables

        // get handle to the vertex shader's vPosition member
        maPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    }

    public void onDrawFrame(GL10 unused) {
        GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT );

        // Add program to OpenGL environment
        GLES20.glUseProgram(mProgram);

        // Prepare the triangle data
        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, 12, triangleVB);
        GLES20.glEnableVertexAttribArray(maPositionHandle);

        // Apply a ModelView Projection transformation
        Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mVMatrix, 0);
        GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);

        // Draw the triangle
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);

        float ratio = (float) width / height;

        Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);

        muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
        Matrix.setLookAtM(mVMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
    }

    private void initShapes() {
        float triangleCoords[] = {
            // X, Y, Z
            -0.5f, -0.25f, 0,
             0.5f, -0.25f, 0,
             0.0f,  0.559016994f, 0
        }; 

        // initialize vertex Buffer for triangle  
        ByteBuffer vbb = ByteBuffer.allocateDirect(
                // (# of coordinate values * 4 bytes per float)
                triangleCoords.length * 4); 
        vbb.order(ByteOrder.nativeOrder());// use the device hardware's native byte order
        triangleVB = vbb.asFloatBuffer();  // create a floating point buffer from the ByteBuffer
        triangleVB.put(triangleCoords);    // add the coordinates to the FloatBuffer
        triangleVB.position(0);            // set the buffer to read the first coordinate
    }

    private int loadShader(int type, String shaderCode) {
        // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
        // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
        int shader = GLES20.glCreateShader(type); 

        // add the source code to the shader and compile it
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);

        return shader;
    }
}

Я все это запускаю на Samsung Galaxy S2.


person sler    schedule 02.04.2012    source источник
comment
Что ж, мне удалось это исправить, изменив ближайшую точку в обзоре на 2: Matrix.frustumM (mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 7); а не 3, не уверен, ошибка ли это с их стороны или я все еще что-то упустил.   -  person sler    schedule 02.04.2012
comment
вы уверены, поддерживает ли устройство opengl2.0?   -  person user936414    schedule 02.04.2012
comment
Да, я раньше запускал на нем приложения OpenGL2.0   -  person sler    schedule 02.04.2012
comment
Образец sdk для этого в api 15 работал у меня. Может быть, вы могли бы сравнить код, чтобы узнать, что произошло.   -  person Jacob Phillips    schedule 02.04.2012
comment
В этом примере кажется, что они помещают треугольник прямо на ближайшую плоскость отсечения. Может быть, ваши устройства, выполняющие этап отсечения, помещают клипы прямо в плоскость, а не позволяют им оставаться. Попробуйте установить для ближней плоскости что-то вроде 2,98 или 2,99 и посмотрите, что произойдет.   -  person MyReliableSchreck    schedule 02.04.2012
comment
Думаю, ты прав, мне показалось, что это сработало.   -  person sler    schedule 04.04.2012
comment
Не похоже на обычную проблему. Возможно, это зависит от устройства?   -  person Vetle    schedule 26.04.2012


Ответы (1)


Исправлено, просто изменила ближайшую точку в lookat, чтобы она была меньше 3:

Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 2, 7);
person sler    schedule 04.04.2012
comment
Спасибо, это действительно сэкономило мне много времени. - person Lei Guo; 31.12.2013
comment
Но почему это так? Я тестировал Galaxy Note 3 / Galaxy S3 / Galaxy S Advance. Только на Note 3 пример работает без доработок. Любые идеи ? - person Abhishek Bansal; 01.05.2014