glUseProgram()的速度有多快?有没有更好的(更快)?:
以下是我的想法:
更改着色器程序后,哪些状态是制服?他们是否保存值(例如,矩阵的值)?
以下是我认为#1的好处:
#2的好处:
Menu
和类Scene3D
具有不同的投影矩阵)答案 0 :(得分:9)
这两个选项中的哪一个更好地取决于这些着色器的作用,它们的不同程度以及您设置的属性/制服的数量以及它们的更改频率。所有案例都没有正确答案。
这就是说:请记住,不仅有状态更改的成本,还有着色器运行时成本,并且每个顶点和每个片段都需要付费。因此,将着色器的复杂性保持在低水平始终是一个好主意,并且通用着色器比专用着色器更复杂。
尽量减少状态变化。如果对象A,C,E使用程序X和B,D,F使用程序Y然后,在其他条件相同的情况下,按顺序呈现ACEBDF,而不是ABCDEF。
关于最后一个问题:除非你重新加上它们,否则程序会保留它们的状态,从而保留制服的一生的价值。但是制服是按程序状态运行的,这意味着如果你有两个在不同程序中具有相同名称和类型的制服,则值不会从一个程序转移到另一个程序。