我正在使用 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 个顶点)。
谢谢!