【问题标题】:How to send multiple MVP matrices to a vertex shader in OpenGL ES 2.0如何在 OpenGL ES 2.0 中将多个 MVP 矩阵发送到顶点着色器
【发布时间】:2012-10-29 07:49:33
【问题描述】:

我正在使用 OpenGL ES 优化 2D 游戏中的精灵渲染,但在 GLSL 和顶点着色器方面我已经达到了我的知识极限。

我有两个大型浮点缓冲区,其中包含多个精灵的顶点坐标和纹理坐标(最终这将是一个缓冲区),以便执行单个 glDrawArrays 调用。这可行,但在将转换矩阵传递到顶点着色器时遇到了麻烦。

我的着色器代码是:

uniform mat4 u_MVPMatrix; 
attribute vec4 a_Position;      
attribute vec2 a_TexCoordinate; 
varying vec2 v_TexCoordinate; 

void main()
{
    v_TexCoordinate = a_TexCoordinate;
    gl_Position = u_MVPMatrix * a_Position;
}

在 Java (Android) 中,我使用 FloatBuffer 来存储顶点/纹理数据,并将其提供给着色器,如下所示:

mGlEs20.glVertexAttribPointer(mVertexHandle, Globals.GL_POSITION_VERTEX_COUNT, GLES20.GL_FLOAT, false, 0, mVertexCoordinates);   
mGlEs20.glVertexAttribPointer(mTextureCoordinateHandle, Globals.GL_TEXTURE_VERTEX_COUNT, GLES20.GL_FLOAT, false, 0, mTextureCoordinates);

(Globals.GL_POSITION_VERTEX_COUNT 等现在只是值为 2 的整数)

我正在传递 MVP(模型/视图/投影)矩阵缓冲区,如下所示:

GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mModelCoordinates); 

(mModelCoordinates 是一个 FloatBuffer,包含 16 个浮点序列,表示每个精灵的 MVP 矩阵)

这会渲染我的场景,但所有精灵共享相同的变换,因此显然只从缓冲区中挑选前 16 个元素,这是有道理的,因为我将“1”作为第二个参数传递。这种方法的文档说:

“如果目标统一变量不是矩阵数组,则应为 1,如果是矩阵数组,则应为 1 或更多。”

所以我尝试使用一个足够大的固定大小数组来修改着色器,以适应我的大多数场景:

uniform mat4 u_MVPMatrix[1000];

但这会导致着色器出错:

无法从“浮点 4X4 矩阵的均匀数组”转换为“浮点 4 分量向量的位置”

这似乎是错误的,因为我不清楚着色器如何知道何时转换到下一个矩阵。

任何人都知道如何让我的着色器为它遇到的每 4 个顶点从我的 MVP 缓冲区中拾取一个不同的 MVP 矩阵(即 NEXT 16 个浮点数)? (我使用的是 GL_TRIANGLE_STRIP,所以每个精灵都有 4 个顶点)。

谢谢!

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    你一次渲染多少个精灵?你在使用精灵图集吗?一般来说,设置变换矩阵并一次绘制一个精灵是最简洁的方法。如果这导致显着减速,则说明您绘制了很多精灵。

    通常情况下,我会根据您的情况推荐 Uniform Buffer Object,但我找不到任何说明 OpenGL ES 支持它的文档。

    变换的本质是什么?您也许可以使用其他数据来推断矩阵。例如,进行简单的翻译可以与精灵顶点数据一起传入。

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多