2012-04-02 8 views
9

He estado siguiendo el tutorial en http://developer.android.com/resources/tutorials/opengl/opengl-es20.html para OpenGL ES en android. He llegado a la sección "Aplicar proyección y vista de la cámara"; sin embargo, parece que siempre obtengo una pantalla en blanco sin triángulo, la sección anterior funcionó perfectamente bien. También intenté copiar todo el tutorial en mi código, pero obtuve el mismo resultado. Cambio de la línea:OpenGL ES tutorial para android no parece funcionar

gl_Position = uMVPMatrix * vPosition; 

a:

gl_Position = vPosition; 

pone la aplicación de nuevo a la primera sección (triángulo estira en función de orientación de la pantalla). ¿Alguna idea de cuál es el problema? Aquí está el código que tengo hasta ahora sólo en caso de que haya perdido algo:

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; 
    } 
} 

estoy corriendo todo esto en un Samsung Galaxy S2.

+1

Bueno, he conseguido solucionarlo cambiando el punto cerca de la mirada en a 2: Matrix.frustumM (mProjMatrix, 0, -ratio, relación, -1, 1, 2, 7); en lugar de 3, no estoy seguro si esto es un error de su parte o si aún me perdí algo. – sler

+0

¿Estás seguro de si el dispositivo es compatible con opengl2.0? – user936414

+0

Sí, he ejecutado aplicaciones OpenGL2.0 en él antes de – sler

Respuesta

13

fijo, acaba de cambiar el punto cercano en el lookat estar bajo 3:

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

Gracias, esto realmente me ahorra mucho tiempo. –

+1

¿Pero por qué es así? He probado en Galaxy Note 3/Galaxy S3/Galaxy S Advance. Solo en el ejemplo de la Nota 3 funciona sin modificaciones. Algunas ideas ? –

Cuestiones relacionadas