2

嗨,这是我在这里的第一篇文章 :) 我在 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 统一数组传递给顶点着色器?

4

3 回答 3

0

如果您阅读此页面,它应该类似于:

GLES20.glUniformMatrix4fv(<handle>, <number of matrices>, <transposed?>, <array of matrices>);
于 2012-12-04T21:49:35.947 回答
0

出于某种原因,在手机上的 GLES 中,统一数组被破坏了 https://www.opengl.org/discussion_boards/showthread.php/176674-Uniform-arrays-in-OpenGLES

于 2017-11-29T17:33:55.703 回答
0

看起来您的着色器仍在将 mvpMatrix 声明为统一

统一 mat4 mvpMatrix[32];

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

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

于 2017-04-30T07:33:44.083 回答