3

我正在使用 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 分量向量的位置”

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

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

谢谢!

4

1 回答 1

0

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

通常,我会针对您的情况推荐一个统一缓冲区对象,但我找不到任何表明 OpenGL ES 支持它的文档。

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

于 2012-10-31T16:15:24.783 回答