2013-05-13 67 views
2

我试过了以下关于绘制形状和应用投影的教训,发现here,但投影似乎不起作用。据我知道我拷贝粘贴所有的代码片段在我的项目,这里是重要的部分代码:OpenGL-es投影似乎不起作用

在我Renderer类:

@Override 
public void onDrawFrame(GL10 unused) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 

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

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

    // Draw shape 
    mTriangle.draw(mMVPMatrix); 
} 

@Override 
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); 
} 

Triangle类的draw方法:

public void draw(float[] mvpMatrix) { 
    GLES20.glUseProgram(mProgram); 

    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition"); // get handle to vertex shader's vPosition member 
    GLES20.glEnableVertexAttribArray(mPositionHandle); // Enable a handle to the triangle vertices 

    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, vertexBuffer); // Prepare the triangle coordinate data 

    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor"); // get handle to fragment shader's vColor member 
    GLES20.glUniform4fv(mColorHandle, 1, color, 0); // Set color for drawing the triangle 


    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); // get handle to shape's transformation matrix 
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0); // Apply the projection and view transformation 

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

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

这个三角形还在被拉伸。我究竟做错了什么?

回答

1

您是否尝试在onSurfaceChanged中进行调试?这些线路会发生什么?尤其是:

    • 什么是传递的值widthheight
    • 哪个值是float ratio = (float) width/height;计算?
    • 您是否看到mProjMatrix的值有任何变化,请致电Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
  1. 您的private final String fragmentShaderCodeclass Triangle是怎么样的?由于行" gl_Position = uMVPMatrix * vPosition;" +中乘法的顺序很重要。

您提供的代码在这里看起来很安静,很困难。