如何在Android中的opengl es 2中将mat4数组传递给着色器?

时间:2012-12-03 15:32:14

标签: android opengl-es vbo

嗨,这是我在这里发表的第一篇文章:) 我在使用Android 2.3 OpenGL ES 2 2D游戏引擎。我尝试通过构建一个大的VBO而不是逐个绘制精灵来提高性能。我使用批处理一次绘制32个精灵。

这是我的顶点着色器定义:

uniform mat4 mvpMatrix[32];

当我使用客户端内存时

for (int k = 0; k < m; k++)
    mvpBuffor.put(models[k], 0, models[k].length);
mvpBuffor.position(0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, m, false, mvpBuffor);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, m * VERTEX_PER_SPRITE);

这非常有效 但是当我尝试使用VBO时

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, batch.mvpBufferIndex);
GLES20.glEnableVertexAttribArray(mMVPMatrixHandle);
GLES20.glVertexAttribPointer(mMVPMatrixHandle, MVP_SIZE * BATCHSIZE, GLES20.GL_FLOAT, false, 0, 0);

我收到错误代码1281

任何人都知道如何将mat4均匀数组传递给顶点着色器?

3 个答案:

答案 0 :(得分:0)

如果你读到这个page,它应该是这样的:

GLES20.glUniformMatrix4fv(<handle>, <number of matrices>, <transposed?>, <array of matrices>);

答案 1 :(得分:0)

看起来你的着色器仍然宣称mvpMatrix是统一的

统一mat4 mvpMatrix [32];

但是你试图将其作为属性传递:

GLES20.glEnableVertexAttribArray(mMVPMatrixHandle); GLES20.glVertexAttribPointer(mMVPMatrixHandle,MVP_SIZE * BATCHSIZE,GLES20.GL_FLOAT,false,0,0);

答案 2 :(得分:0)

出于某种原因,在移动设备上的GLES中统一阵列被破坏了 https://www.opengl.org/discussion_boards/showthread.php/176674-Uniform-arrays-in-OpenGLES