1

编辑:对,已修复:D 问题是我在调用 glUseProgram() 之前尝试设置投影矩阵


我从 Android 上的 GL ES 2.0 开始,并试图从 1.1 迁移我的一些代码一起工作,但除了空白屏幕,我似乎什么也得不到。

我将模型视图矩阵传递给我的顶点着色器,并在将生成的 mvp 矩阵与顶点位置相乘之前将其与正交投影相乘。这是我要澄清的着色器:

顶点着色器

attribute vec3 Position;
uniform mat4 Projection;
uniform mat4 ModelView;

void main() {
  mat4 mvp = Projection * ModelView;
  gl_Position = mvp * vec4(Position.xyz, 1);
}

片段着色器

precision mediump float;
uniform vec4 Color;

void main() {
  gl_FragColor = Color;
}

我正在渲染器的 onSurfaceChangedFunction() 中构建投影矩阵:

int projectionHandle = GLES20.glGetUniformLocation(shaderProg, "Projection");

Matrix.orthoM(projection, 0, -width / 2, width / 2, -height / 2, height / 2, -10, 10);
GLES20.glUniformMatrix4fv(projectionHandle, 1, false, projection, 0);

然后在我的 onDrawFrame() 中,我调用每个演员的绘图例程,看起来像

nt positionHandle = GLES20.glGetAttribLocation(Renderer.getShaderProg(), "Position");
nt colorHandle = GLES20.glGetAttribLocation(Renderer.getShaderProg(), "Color");
nt modelHandle = GLES20.glGetUniformLocation(Renderer.getShaderProg(), "ModelView");

float[] modelView = new float[16];

Matrix.setIdentityM(modelView, 0);
Matrix.rotateM(modelView, 0, rotation, 0, 0, 1.0f);
Matrix.translateM(modelView, 0, position.x, position.y, 1.0f);

GLES20.glUniformMatrix4fv(modelHandle, 1, false, modelView, 0);
GLES20.glUniform4fv(colorHandle, 1, color.toFloatArray(), 0);

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 0, vertBuffer);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
GLES20.glDisableVertexAttribArray(positionHandle);

我意识到我可以对此进行一些优化,但我只想让它首先工作。顶点位于 FloatBuffer 中,并以原点为中心。关于我做错了什么有什么想法吗?我一直在根据各种教程和 SO 问题/答案检查我的代码,但看不到我做错了什么。

4

1 回答 1

0

对,已修复:D 问题是我在调用 glUseProgram() 之前尝试设置投影矩阵

于 2013-08-07T12:56:34.800 回答