1

我制作了一个粒子发射器。我不需要在转换中管理父/子层次结构。

什么是最快的?

glPushMatrix()
    ..apply tranformations
    ...draw object
glPopMatrix()

或者

glLoadIdentity()
    ..apply tranformations
    ...draw object

对于每个我的粒子?

我在我的程序中尝试了这两种技术,但我没有看到 FPS 有任何区别。少数变体可能来自我 PC 上的其他程序,例如防病毒程序。(我猜)

4

2 回答 2

5

两者都不。如果您正在渲染一个粒子系统,其中粒子的数量可能会成为性能问题,那么为每个粒子发送一个变换(这意味着为每个粒子发出单独的渲染调用)将扼杀任何性能希望。

如果你想要一个粒子系统,最好的办法是将粒子全部放在一个数组中(最好是一个缓冲区对象)并在一次调用中渲染它。

于 2013-05-10T09:07:17.030 回答
0

我想补充一点,这glPush/glPop是另一回事glIdentity

glPush保存矩阵堆栈的当前顶部并glPop恢复该状态。

glIdentity清除矩阵堆栈的当前顶部。

您的设计存在几个问题:

  • 此功能在现代 OpenGL 中已被弃用,因此最好将其他东西用于矩阵内容。例如 GLM
  • 如果你对每个粒子都这样做,那将是应用程序的一个巨大的性能瓶颈!

对于粒子更新/渲染,最好:

  • 在循环中计算粒子的最终/世界位置并将这些位置保存到缓冲区,例如使用 VBO
  • 使用前一个缓冲区来渲染点。这样,您可以使用一个绘图调用(+ 几行设置)来绘制大量点。

这是一个很好的链接:http: //3dgep.com/ ?p=1057

于 2013-05-10T12:17:36.990 回答