glUseProgram()和速度后制服的行为

时间:2012-03-13 11:26:11

标签: c++ opengl graphics glsl uniform

glUseProgram()的速度有多快?有没有更好的(更快)?:

以下是我的想法:

  1. 使用1个通用着色器程序,但有许多输入设置和属性(每个图形类的设置)
  2. 为每个图形类使用多个着色器
  3. 更改着色器程序后,哪些状态是制服?他们是否保存值(例如,矩阵的值)?

    以下是我认为#1的好处:

    • 不使用glUseProgram()

    #2的好处:

    • 没有矩阵更改(例如,如果类Menu和类Scene3D具有不同的投影矩阵)

1 个答案:

答案 0 :(得分:9)

这两个选项中的哪一个更好地取决于这些着色器的作用,它们的不同程度以及您设置的属性/制服的数量以及它们的更改频率。所有案例都没有正确答案。

这就是说:请记住,不仅有状态更改的成本,还有着色器运行时成本,并且每个顶点和每个片段都需要付费。因此,将着色器的复杂性保持在低水平始终是一个好主意,并且通用着色器比专用着色器更复杂。

尽量减少状态变化。如果对象A,C,E使用程序X和B,D,F使用程序Y然后,在其他条件相同的情况下,按顺序呈现ACEBDF,而不是ABCDEF。

关于最后一个问题:除非你重新加上它们,否则程序会保留它们的状态,从而保留制服的一生的价值。但是制服是按程序状态运行的,这意味着如果你有两个在不同程序中具有相同名称和类型的制服,则值不会从一个程序转移到另一个程序。