我已将许多粒子的所有顶点数据组合到一个数组中。我如何以保留其独特翻译的方式批量绘制所有这些粒子?
我很困惑如何做到这一点。我已经在这个问题上创建了两个帖子,但仍然感到困惑。我目前正在使用 OpenGL ES 1.1,但如果这意味着我实际上可以通过独特的平移、旋转等完成粒子的批量渲染,我愿意升级到 2.0。
这两个帖子是:
- OpenGL ES - 如何批量渲染 500 多个具有不同 alpha、旋转和缩放的粒子?
- 如何在 iPhone OpenGL ES 粒子系统中绘制 1000 多个粒子(带有独特的旋转、缩放和 alpha)而不减慢游戏速度?
两者都解释了一种高级方法,但我需要知道如何渲染这批粒子,其中每个粒子的平移、旋转和缩放都会改变每一帧。如果您的答案是计算 CPU 上的翻译,那么请举一个例子。
我目前在我的实现中使用顶点数组对象。我知道我应该使用 VBO 以获得最佳性能。我将实现 VBO,但首先我想实现批处理。成功完成批处理后,我会将 VAO 更改为 VBO。因此,这个问题的重点是如何使用 VAO 来实现这一点。
这是我在批处理之前的代码,我将在模型视图矩阵中推送一个新矩阵,根据当前正在渲染的 Actor 进行平移、旋转、缩放和 alpha,并绘制当前正在渲染的 Actor 的顶点和纹理坐标:
glPushMatrix();
glTranslatef(translation.x, translation.y, translation.z);
// rotation
glRotatef(rotation.x, 1, 0, 0);
glRotatef(rotation.y, 0, 1, 0);
glRotatef(rotation.z, 0, 0, 1);
// scale
glScalef(scale.x, scale.y, scale.z);
// color and alpha
glColor4f(1.0, 1.0, 1.0, alpha);
glVertexPointer(2, GL_FLOAT, 0, aSprite.vertices);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, texturedQuad.textureCoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
现在,鉴于我已将所有粒子 Actor 的顶点和纹理坐标组合到批处理数组中,我想在模型视图矩阵中推送一个新矩阵,并以适当的平移、旋转、比例绘制这些 Actor 的顶点和纹理坐标,阿尔法等。
所以我的猜测是它看起来像:
static GLFloat verticesBatched[appropriate_length] = ...; // I have a method to populate this array based on the Actors to render
static GLFloat textureCoordsBatched[appropriate_length] = ...; // I have a method to populate this array based on the Actors to render
glPushMatrix();
// perform CPU matrix manipulation to manually translate, rotate, and scale all vertices
glVertexPointer(2, GL_FLOAT, 0, verticesBatched);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordsBatched);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
一个有效的答案是一个代码示例,它清楚地说明了这个问题的解决方案。