我正在尝试实现 VBO 以提高 OpenGL 中的渲染速度,虽然我了解整体概念,但我不确定如何在 2D 中实现精灵。我发现的所有实现似乎都是用于绘制所有顶点相对于彼此固定的 3D 模型。然而,在 2D 游戏中,每个精灵都有自己的位置,因此也有自己的 MVP 矩阵。
它似乎是如何完成的:
Basic vertex shader:
"uniform mat4 uMVPMatrix; \n" +
"attribute vec4 vPosition;" +
"attribute vec2 texCoord;" +
"varying vec2 vTexCoord;" +
"void main() {" +
// matrix must be included as part of gl_Position
" gl_Position = uMVPMatrix * vPosition;" +
" vTexCoord = texCoord;" +
"}";
Drawing with VBOs (pseudocode)
1. Bind vertex/texture buffers
2. Load MVP matrix with glUniformMatrix4fv
3. Call glDrawArrays/glDrawElements to draw the all the vertices in one call
有没有一种简单的方法来扩展上述方法以允许不断变化的 MVP?
两种可能的想法:
将顶点加载到 VBO 中,但要绘制每个精灵,如上加载每个精灵的 MVP 矩阵。唯一的节省是您不必每次都传入顶点数据,但您仍然需要调用 glVertexAttribPointer 来索引每个精灵在 VBO 中的正确位置。我想速度节省将是最小的。
不是将 MVP 矩阵作为一个统一的,而是将其定义为一个属性。将每个精灵的所有 MVP 连接到一个大数组中,并使用 glVertexAttribPointer 加载它。似乎不可能使用 glVertexAttribPointer 一次加载一个矩阵(你最多可以加载一个 vec4),所以我必须用 4 次连续调用逐列加载它。然后我应该能够独立地转换每个精灵。应该比我当前的实现获得相当大的速度改进,尽管连接 MVP 仍然需要时间。
有没有比上面更简单的实现?我想必须有一些“标准”的方式来作为批量绘制精灵。
编辑
我决定使用选项 2,但是我在开始工作时遇到了问题:Shader attribute mat4 not binding correct (Opengl ES 2.0 Android)