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

WOR*_*SER 8 c++ opengl graphics glsl uniform

glUseProgram()的速度有多快?还有什么更好的(更快)?:

这是我的想法:

  1. 使用1个通用着色器程序,但有许多输入设置和属性(每个图形类的设置)
  2. 为每个图形类使用多个着色器

更改着色器程序后,哪些州是制服?他们是否保存了值(例如,矩阵的值)?

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

  • 不使用glUseProgram()

而#2的好处:

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

haf*_*fax 9

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

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

尽量减少状态变化.如果你有使用程序X的对象A,C,E,使用程序Y的D,F,那么在其他条件相同的情况下,按照ACEBDF而不是ABCDEF进行渲染.

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