【问题标题】:How to pass mat4 array to shader in opengl es 2 in Android?如何在Android的opengl es 2中将mat4数组传递给着色器?
【发布时间】:2012-12-03 15:32:14
【问题描述】:

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

【问题讨论】:

  • 哪一行给出了错误?

标签: android opengl-es vbo


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    统一 mat4 mvpMatrix[32];

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

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

    【讨论】:

      【解决方案3】:

      出于某种原因,在移动设备上的 GLES 中,统一数组已损坏 https://www.opengl.org/discussion_boards/showthread.php/176674-Uniform-arrays-in-OpenGLES

      【讨论】:

      • 在 GLES 中没有破,规范很明确:“数组的第一个元素的位置可以通过使用数组的名称来检索,或者通过使用附加的名称”[0] “。”。如果 JoshKlint 在该线程中的断言是正确的(我想他们在撰写本文时是正确的)。然后 5 年前 iOS 和 Galaxy Tab 驱动程序出现了不同的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多