我正在开发一个需要一次渲染 500-800 个粒子的 iOS 游戏。我了解到,在 OpenGL ES 中批量渲染许多精灵是一个好主意,而不是调用glDrawArrays(..)
游戏中的每个精灵,以便能够在不大幅降低帧速率的情况下渲染更多精灵。
我的问题是:如何批量渲染 500 多个具有不同 alpha、旋转和比例但共享相同纹理图集的粒子?这个问题的重点是每个粒子的不同 alphas、rotations和scales。
我意识到这个问题与How do I draw 1000+particles (w/unique rotation, scale, and alpha) in iPhone OpenGL ESparticle system without slowing the game非常相似?,但是,该问题并未涉及批量渲染。在我利用顶点缓冲区对象之前,我想了解 OpenGL ES 中的批处理渲染,带有唯一的 alpha、旋转和缩放(但具有相同的纹理)。因此,虽然我最终计划使用 VBO,但我想首先采用这种方法。
代码示例将不胜感激,如果您像某些示例一样使用索引数组,请解释索引数组的结构和用途。
编辑我正在使用 OpenGL ES 1.1。
编辑下面是我如何渲染场景中每个粒子的代码示例。假设它们共享相同的纹理,并且在此代码执行之前,纹理已经绑定在 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();
}
非常感谢此方法的替代代码!