更改着色器程序时是否需要重新绑定制服或属性?


11

渲染场景通常涉及多个着色器程序,在我的情况下,所有着色器程序都使用相同的属性,并且至少共享一些制服。为了使它们正常工作,我目前保持安全,这意味着我每次在着色器程序之间切换时都重新绑定属性并获得适当的统一位置。因此,基本上每个帧中都有多次,这可能不是最佳方法。

因此,在切换着色器程序之后,是否有必要(通常​​)重新绑定属性和制服?又为什么呢?

如果是这样,是否有办法在程序启动时执行一次,而不必再次触摸它们(设置统一值除外)?

Answers:


12

只要您确保两个着色器中的属性位置相同,就不需要重新绑定属性。(通常使用layout(location = X)GLSL中的语法,但glBindAttribLocation如果前者不可用,也可以使用该语法。)

但是,均匀性是“着色器对象”状态的一部分,因此将需要为每个着色器至少设置一次。最小化此成本的一种方法是使用Uniform Buffer Object,它将包含所有统一值,然后可以通过一次调用将其绑定到着色器。


在您的UBO链接上:“最后,它们可以用于在不同程序之间共享信息。因此,修改单个缓冲区可以有效地允许更新多个程序中的制服。”
Zouch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.