OpenGL-es投影似乎不起作用

时间:2013-05-13 09:16:58

标签: android opengl-es

我已经尝试过关于绘制形状和将投影应用于here的课程,但投影似乎不起作用。据我所知,我已经复制粘贴了项目中的所有代码片段,以下是重要的代码部分:

在我的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);
}

draw类的Triangle方法:

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 个答案:

答案 0 :(得分:1)

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

    • 传递的值widthheight是什么?
    • float ratio = (float) width / height;计算哪个值?
    • 您是否看到在致电Matrix.frustumM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);之后对 mProjMatrix 的值进行了哪些更改?
  1. private final String fragmentShaderCodeclass Triangle的样子如何?由于行" gl_Position = uMVPMatrix * vPosition;" +中的乘法顺序很重要。

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