2012-12-14 46 views
1

我想实现VBOs来提高OpenGL渲染速度,虽然我理解整体概念,但我不确定如何在2D中实现精灵。我发现所有的实现似乎都是绘制一个三维模型,其中所有的顶点都是相互固定的。然而,在2D游戏中,每个精灵都有自己的位置,因此拥有自己的MVP矩阵。实现VBOs在OpenGL ES中渲染精灵2

如何似乎做:

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的?

两个候选条件的想法:

  1. 加载了顶点到维也纳各组织的,而是借鉴每个精灵,装载如上每个人的MVP矩阵。只保存就是你不必每次都传入顶点数据,但你仍然需要调用glVertexAttribPointer来索引每个精灵的VBO中的正确位置。我认为节省的速度会很小。

  2. 不是将MVP矩阵作为一个统一体,而是将其定义为一个属性。将每个精灵的所有MVP连接成一个大数组,并使用glVertexAttribPointer加载它。似乎不可能使用glVertexAttribPointer一次加载一个矩阵(您最多可以加载vec4),所以我将不得不逐列加载4个连续的调用。然后我应该能够独立地转换每个精灵。应该在当前的实施中获得相当大的速度提升,尽管并置MVP仍然需要时间。

是否有比上述更简单的实现?我想象一下,像批处理绘制精灵一样,有一些“标准”的方法来做到这一点。

编辑

我决定去与选项2,但是我有自己动手的问题:Shader attribute mat4 not binding correctly (Opengl ES 2.0 Android)

回答

2

哪些常见的2D引擎在那里做的是提供一个基于树的渲染。一个节点有它的模型矩阵,并且有一些孩子受父母模型矩阵和他们自己的矩阵的影响。在运行时访问每个节点并使其将父级矩阵和自己的矩阵连接成一个矩阵。除非你渲染了数千个节点(精灵),否则你不应该担心有关将如此多的矩阵传递给驱动程序内存的性能问题。

编辑:你也可以有一个特定类型的节点,通常称为阿特拉斯,你添加了预先计算的四边形,只受节点的模型矩阵影响(见https://github.com/cocos2d/cocos2d-iphone/blob/master-v2/cocos2d/CCAtlasNode.mhttps://github.com/TraxNet/ShadingZen/blob/master/library/src/main/java/org/traxnet/shadingzen/core2d/QuadAtlas.java)。

+0

我可能会在赛道上进一步观察,但是现在我已经决定在上面的帖子中追求选项2,因为它似乎是我目前所拥有的相当直接的进展。不过,正如解释的,在编辑后的操作系统中,我遇到了麻烦。 – awr

+0

在这里发布一个新问题并留下一个指向其他问题的链接会更好。 – Trax