opengl glLoadIdentity()比glPushMatrix()/ glPopMatrix()更快?

时间:2013-05-10 09:01:47

标签: performance opengl

我做了一个粒子发射器。我不需要在我的转换中管理父/子层次。

最快的是什么?

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

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

每个我的特征?

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

2 个答案:

答案 0 :(得分:5)

都不是。如果你渲染一个粒子数量可能是性能问题的粒子系统,发送每个粒子的变换(这意味着为每个粒子发出一个单独的渲染调用)将会消除任何希望性能

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

答案 1 :(得分:0)

我想补充说glPush/glPopglIdentity

不同

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

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

您的设计存在以下几个问题:

  • 在现代OpenGL中不推荐使用此功能,因此最好使用其他内容来处理矩阵内容。例如GLM
  • 如果你为每个粒子都这样做,它将成为应用程序的巨大性能瓶颈!

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

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

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