我想实现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的?
两个候选条件的想法:
加载了顶点到维也纳各组织的,而是借鉴每个精灵,装载如上每个人的MVP矩阵。只保存就是你不必每次都传入顶点数据,但你仍然需要调用glVertexAttribPointer来索引每个精灵的VBO中的正确位置。我认为节省的速度会很小。
不是将MVP矩阵作为一个统一体,而是将其定义为一个属性。将每个精灵的所有MVP连接成一个大数组,并使用glVertexAttribPointer加载它。似乎不可能使用glVertexAttribPointer一次加载一个矩阵(您最多可以加载vec4),所以我将不得不逐列加载4个连续的调用。然后我应该能够独立地转换每个精灵。应该在当前的实施中获得相当大的速度提升,尽管并置MVP仍然需要时间。
是否有比上述更简单的实现?我想象一下,像批处理绘制精灵一样,有一些“标准”的方法来做到这一点。
编辑
我决定去与选项2,但是我有自己动手的问题:Shader attribute mat4 not binding correctly (Opengl ES 2.0 Android)
我可能会在赛道上进一步观察,但是现在我已经决定在上面的帖子中追求选项2,因为它似乎是我目前所拥有的相当直接的进展。不过,正如解释的,在编辑后的操作系统中,我遇到了麻烦。 – awr
在这里发布一个新问题并留下一个指向其他问题的链接会更好。 – Trax