2012-04-02 8 views
9

Tôi đã làm theo hướng dẫn tại http://developer.android.com/resources/tutorials/opengl/opengl-es20.html cho OpenGL ES trên Android. Tôi đã nhận được, "Áp dụng chiếu và Camera View" phần tuy nhiên tôi luôn luôn có vẻ để có được một màn hình trống không có tam giác, phần trước làm việc hoàn toàn tốt đẹp. Tôi cũng đã cố gắng chỉ cần sao chép dán toàn bộ hướng dẫn vào mã của tôi nhưng có kết quả tương tự. Thay đổi dòng:Hướng dẫn OpenGL ES dành cho Android dường như không hoạt động

gl_Position = uMVPMatrix * vPosition; 

tới:

gl_Position = vPosition; 

đặt ứng dụng trở lại phần đầu tiên (hình tam giác kéo dài tùy thuộc vào định hướng màn hình). Bất kỳ ý tưởng gì vấn đề là gì? Đây là mã tôi có cho đến nay chỉ trong trường hợp tôi bị mất một cái gì đó:

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

Tôi đang chạy tất cả điều này trên Samsung Galaxy S2.

+1

Vâng, tôi cố gắng sửa chữa nó bằng cách thay đổi điểm gần trong nhìn đến 2: Matrix.frustumM (mProjMatrix, 0, -ratio, tỷ lệ, -1, 1, 2, 7); thay vì 3, không chắc chắn nếu đây là một lỗi trên một phần của họ hoặc nếu tôi vẫn còn bỏ lỡ một cái gì đó. – sler

+0

bạn có chắc chắn nếu thiết bị hỗ trợ opengl2.0? – user936414

+0

Vâng, tôi đã chạy các ứng dụng OpenGL2.0 trên nó trước – sler

Trả lời

13

cố định, chỉ cần thay đổi quan điểm gần trong lookat là dưới 3:

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

Cảm ơn, điều này thực sự giúp tôi tiết kiệm rất nhiều thời gian. –

+1

Nhưng tại sao lại như thế? Tôi đã thử nghiệm trên Galaxy Note 3/Galaxy S3/Galaxy S Advance. Chỉ trên Note 3 ví dụ hoạt động mà không có sửa đổi. Bất kỳ ý tưởng? –