编辑:对,已修复: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 问题/答案检查我的代码,但看不到我做错了什么。