2014-06-25 48 views
0

我想應用投影和相機視圖,但我沒有得到想要的結果。將我的設備從縱向旋轉到橫向模式時,繪製的三角形仍會變形。這是從我的三角類draw()方法:投影和相機視圖不能在OpenGL上工作

public void draw(float[] mvpMatrix) { 

     int vertexCount = 3; 
     int vertexStride = 3 * COORDS_PER_VERTEX; 
     int mMVPMatrixHandle; 



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


     // get handle to vertex shader's vPosition member 
     mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); 
     // get handle to shape's transformation matrix 
     mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); 



     // Enable a handle to the triangle vertices 
     GLES20.glEnableVertexAttribArray(mPositionHandle); 


     // Prepare the triangle coordinate data 
     GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, 
            GLES20.GL_FLOAT, false, 
            vertexStride, vertexBuffer); 
    // Pass the projection and view transformation to the shader 
     GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); 

     // get handle to fragment shader's vColor member 
     mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); 

     // Set color for drawing the triangle 
     GLES20.glUniform4fv(mColorHandle, 1, color, 0); 

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

     // Disable vertex array 
     GLES20.glDisableVertexAttribArray(mPositionHandle); 

    } 

我不知道爲什麼它不工作,也有我的onDrawFrame()和onSurfaceChanged()從渲染器類方法:

private float[] mProjectionMatrix = new float[16] 
private float[] mViewMatrix = new float[16];          
private float[] mMVPMatrix = new float[16]; 




public void onDrawFrame(GL10 unused) { 
    // Redraw background color 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 


    // Set the camera position (View matrix) 
    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 


    // Calculate the projection and view transformation 
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0); 

    // Draw shape 
    mTriangle.draw(mMVPMatrix); 


} 

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

    float ratio = (float) width/height; 

    // this projection matrix is applied to object coordinates 
    // in the onDrawFrame() method 

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

回答

0

一些代碼丟失,這裏應該怎樣補充說:

private final String vertexShaderCode = 

    "uniform mat4 uMVPMatrix;" + 
    "attribute vec4 vPosition;" + 
    "void main() {" + 
    " gl_Position = vPosition * uMVPMatrix;" + 
    "}"; 
+0

這是一個回答或評論?如果這是一個答案,你能否多解釋一下,比如它應該去哪裏以及它爲什麼起作用? – skrrgwasme