我正在开发一款 iOS 游戏,需要一次渲染 500-800 个粒子。我了解到,在 OpenGL ES 中批量渲染许多精灵而不是调用是一个好主意glDrawArrays(..)
在游戏中的每个精灵上,以便能够渲染更多精灵而不大幅降低帧速率。
我的问题是: 我如何batch渲染 500 多个粒子,它们都具有不同的 Alpha、旋转和比例,但共享相同的纹理图集?这个问题的重点在于不同的 alphas, 旋转, and scales对于每个粒子。
我意识到这个问题非常类似于如何在 iPhone OpenGL ES 粒子系统中绘制 1000 多个粒子(具有独特的旋转、缩放和 Alpha)而不减慢游戏速度? https://stackoverflow.com/questions/7435123/how-do-i-draw-1000-particles-w-unique-rotation-scale-and-alpha-in-iphone-o然而,这个问题并没有解决批量渲染的问题。在利用顶点缓冲区对象之前,我想了解 OpenGL ES 中的批量渲染,以及独特的 alpha、旋转和缩放(但具有相同的纹理)。因此,虽然我计划最终使用 VBO,但我想首先采用这种方法。
代码示例将不胜感激,如果您像某些示例一样使用索引数组,请解释索引数组的结构和用途。
EDIT我正在使用 OpenGL ES 1.1。
EDIT下面是我如何渲染场景中每个粒子的代码示例。假设它们共享相同的纹理,并且在执行此代码之前该纹理已绑定在 OpenGL ES 1.1 中。
- (void) render {
glPushMatrix();
glTranslatef(translation.x, translation.y, translation.z);
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
glScalef(scale.x, scale.y, scale.z);
// change alpha
glColor4f(1.0, 1.0, 1.0, alpha);
// glBindTexture(GL_TEXTURE_2D, texture[0]);
glVertexPointer(2, GL_FLOAT, 0, texturedQuad.vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texturedQuad.textureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
}
此方法的替代代码将不胜感激!