9

glUseProgram() 有多快?有什么更好(更快)的吗?:

以下是我的想法:

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

更改着色器程序后制服处于什么状态?他们是否保存值(例如,矩阵的值)?

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

  • 不使用 glUseProgram()

#2 的好处:

  • 没有矩阵变化(例如,如果类Menu和类Scene3D有不同的投影矩阵)
4

1 回答 1

10

这两个选项中哪个更好在很大程度上取决于这些着色器的作用、它们的不同之处以及您设置的属性/制服的数量以及它们的更改频率。对于所有情况,没有一个正确的答案。

也就是说:请记住,不仅有状态更改的成本,还有着色器运行时成本,它是按每个顶点和每个片段支付的。所以保持着色器的复杂度较低总是一个好主意,通用着色器比专用着色器更复杂。

最小化状态变化。如果您有使用程序 X 的对象 A、C、E 和使用程序 Y 的对象 B、D、F,那么在其他条件相同的情况下,按 ACEBDF 的顺序渲染,而不是 ABCDEF。

关于最后一个问题:程序在其生命周期内保持其状态,从而保持制服的价值,除非您重新链接它们。但是制服是每个程序状态的,这意味着如果您在不同的程序中有两个具有相同名称和类型的制服,则值不会从一个程序转移到另一个程序。

于 2012-03-13T13:06:33.213 回答