改进粒子系统OpenGL

Cur*_*ain 4 opengl opengl-es

我正在寻找一种方法来提高我的粒子系统性能,因为它在FPS方面非常昂贵.这是因为我打电话:

glDrawElements(GL_TRIANGLE_STRIP, mNumberOfIndices,
          GL_UNSIGNED_SHORT, 0);
Run Code Online (Sandbox Code Playgroud)

我为我的应用程序中的每个粒子(可能在1000到5000个粒子之间)调用此方法.请注意,当增加到超过1000个粒子时,我的应用程序开始在FPS中下降.我正在使用VBO:s,但调用此方法时的性能太高.

任何想法如何使粒子系统更有效?

编辑:这是我的粒子系统绘制的东西:

glBindTexture(GL_TEXTURE_2D, textureObject);
glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer[0]);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vboTextureBuffer[0]);
glTexCoordPointer(2, GL_FLOAT, 0, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboIndexBuffer[0]);

Vector3f partPos;

for (int i = 0; i < m_numParticles; i++) {
    partPos = m_particleList[i].m_pos;          
    glTranslatef(partPos.x, partPos.y, partPos.z);
    glDrawElements(GL_TRIANGLE_STRIP, mNumberOfIndices, 
        GL_UNSIGNED_SHORT, 0);
    gl.glTranslatef(-partPos.x, -partPos.y, -partPos.z);
}
Run Code Online (Sandbox Code Playgroud)

dat*_*olf 6

你描述的方式,听起来你每个粒子都有一个自己的VBO.这不是应该怎么做的.将所有粒子放入单个VBO中,并使用单个glDrawElementsglDrawArrays调用立即绘制所有粒子.或者甚至更好,如果可用:使用实例化.

  • 朱利安阿桑奇 重点是:粒子位置数据*然而*从你的系统内存进入VRAM进行绘图.在您当前的实施中,它以内部制服的形式旅行,通过glTranslate设置.如果将粒子位置作为VBO的一部分,每帧更改它,它仍将是与总线相同的数据量.但绘图操作会更快. (3认同)