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

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

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

#1 楼

只要确保它们在两个着色器中的位置保持不变,就不需要重新绑定属性。 (通常在GLSL中使用layout(location = X)语法,但如果前者不可用,也可以使用glBindAttribLocation来完成。)

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

评论


$ \ begingroup $
在您的UBO链接上:“最后,它们可用于在不同程序之间共享信息。因此,修改单个缓冲区可以有效地允许更新多个程序中的制服。”
$ \ endgroup $
– Zouch
17年2月2日在18:07

$ \ begingroup $
确保将现有缓冲区重用于相同的属性索引。
$ \ endgroup $
–像素
20 Jul 26'8:40