我正在尝试实现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矩阵作为统一体,而是将其定义为属性。将每个sprite的所有MVP连接成一个大型数组,并使用glVertexAttribPointer加载它。似乎不可能使用glVertexAttribPointer一次加载矩阵(你最多可以在vec4中加载),所以我必须逐列加载它,连续4次调用。然后我应该能够独立地转换每个精灵。虽然连接MVP仍然需要时间,但是我的当前实现应该会有相当大的速度提升。
是否有比上述更简单的实施?我想必须有一些“标准”的方式来做这个批量绘图精灵。
修改
我决定使用选项2,但我遇到问题:Shader attribute mat4 not binding correctly (Opengl ES 2.0 Android)
答案 0 :(得分:2)
那里常见的2d引擎是提供基于树的渲染。一个节点有它的模型矩阵,并且有一些子节点都受父模型矩阵和它们自己的矩阵的影响。在运行时访问每个节点并将其渲染为将父矩阵和自己的矩阵连接成一个矩阵。除非您渲染数千个节点(精灵),否则您不必担心将如此多的矩阵传递到驱动程序内存中的性能问题。
编辑:您也可以拥有一种特定类型的节点,通常称为atlas,您可以向其中添加仅受节点模型矩阵影响的预计算四边形(请参阅https://github.com/cocos2d/cocos2d-iphone/blob/master-v2/cocos2d/CCAtlasNode.m或https://github.com/TraxNet/ShadingZen/blob/master/library/src/main/java/org/traxnet/shadingzen/core2d/QuadAtlas.java)。