glUseProgram() 有多快?有什么更好(更快)的吗?:
以下是我的想法:
- 使用 1 个通用着色器程序,但具有许多输入设置和属性(每个图形类的设置)
- 为每个图形类使用超过 1 个着色器
更改着色器程序后制服处于什么状态?他们是否保存值(例如,矩阵的值)?
以下是我认为#1 的好处:
- 不使用 glUseProgram()
#2 的好处:
- 没有矩阵变化(例如,如果类
Menu
和类Scene3D
有不同的投影矩阵)
这两个选项中哪个更好在很大程度上取决于这些着色器的作用、它们的不同之处以及您设置的属性/制服的数量以及它们的更改频率。对于所有情况,没有一个正确的答案。
也就是说:请记住,不仅有状态更改的成本,还有着色器运行时成本,它是按每个顶点和每个片段支付的。所以保持着色器的复杂度较低总是一个好主意,通用着色器比专用着色器更复杂。
最小化状态变化。如果您有使用程序 X 的对象 A、C、E 和使用程序 Y 的对象 B、D、F,那么在其他条件相同的情况下,按 ACEBDF 的顺序渲染,而不是 ABCDEF。
关于最后一个问题:程序在其生命周期内保持其状态,从而保持制服的价值,除非您重新链接它们。但是制服是每个程序状态的,这意味着如果您在不同的程序中有两个具有相同名称和类型的制服,则值不会从一个程序转移到另一个程序。