我已经设置了VBO并使其工作,但遇到了设计困境,希望得到更有经验的OpenGL ES 2.0专家的建议。
我想绘制一堆多边形精灵,它们经常移动。这是因为它们是动态Box2D物体,如果您熟悉Box2D的话。这些多边形体是通过使用GL_TRIANGLE_FAN生成的,这在ES 2.0上是相当关键的,因为GL_POLYGON不可用。
多边形还具有其他属性,例如颜色,可能会在应用程序生命周期的某个阶段进行更改,但是顶点位置几乎每个帧都会更改。
多边形在游戏中分组,因此我的意图是管理和绘制每组的交错顶点/颜色数组,而不是每个物体,以尝试最小化GPU通信。
成功的路线有很多,我一直在阅读《OpenGL ES 2.0编程指南》以寻求与VBO相关的尽可能多的信息和优化技巧,以下是它们的建议:
- 交错数据是有利的,因为“每个顶点的属性数据可以按顺序读取”。 - 该书建议“如果需要修改一组顶点属性数据,则可以将具有动态特性的顶点属性存储在单独的缓冲区中”。 - 建议“尽可能使用GL_HALF_FLOAT_OES”,特别是对于颜色,因为未投影的顶点位置可能超出此空间要求。 - 如果正在更新整个缓冲区,则应仅使用glMapBufferOES,并且即使在这种情况下,该操作“与glBufferData相比仍然可能很昂贵”。
以下是我的问题:
如果使用GL_TRIANGLE_FAN作为绘图模式,这是否会强制我针对每个物体存储一个VBO而不是每个组?或者一个公共的顶点位置来‘结束’扇形,并且当前物体将导致在组VBO中为下一个物体绘制新的扇形?
尽管顶点位置经常更新,我是否应该交错所有数据,还是将它们分开/只是将位置分开成它们自己的VBO?
根据上面提供的建议,我应该在每次更新渲染时完全glBufferData我的顶点位置,而不是使用glMapBufferOES或glBufferSubData来更新缓冲区中的位置。
在许多移动多边形的情况下,是否有任何未提及的功能/设计选择可以利用以增强性能?
我应该尝试使用GL_HALF_FLOAT_OES进行颜色存储,即在2个浮点数的空间中,我是否应该存储4个半浮点数?如果答案是‘是’,那么我只需使用GLfloat大小的任何GL类型来为每个颜色使用位OR,然后插入到适当的属性数组中即可。
一旦我创建了X个VBO,每次渲染时我需要做的唯一调用是glBindBuffer、glBufferData和glDrawElements/Arrays,还是每次使用glBufferData时还必须调用glEnableVertexAttribArray和glVertexAttribPointer?
我非常感谢您对此的进一步建议,谢谢。