我开始使用Android上的GL ES 2.0,并尝试从1.1迁移我的一些代码我按照官方文档定义了顶点和碎片着色器,经过一些谷歌搜索我理解了模型/投影矩阵一起工作,但我似乎得不到任何东西,只有一个空白的屏幕。
我将模型视图矩阵传递给我的vert着色器,并将其与正交投影相乘,然后将得到的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()中,我调用每个actor的绘制例程,看起来像
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问题/答案,看不出我做错了什么。
答案 0 :(得分:0)
是的,修正了它:D问题是我在调用glUseProgram()之前试图设置Projection矩阵