Android GL ES 2.0 Ortho Matrices

时间:2013-08-02 08:30:11

标签: android opengl-es-2.0 shader

编辑:对,修好它:D问题是我在调用glUseProgram()之前试图设置Projection矩阵


我开始使用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问题/答案,看不出我做错了什么。

1 个答案:

答案 0 :(得分:0)

是的,修正了它:D问题是我在调用glUseProgram()之前试图设置Projection矩阵