那么,在切换着色器程序之后,是否有必要(通常)重新绑定属性和制服?为什么?
如果这样,有没有办法在程序启动时执行一次,而不必再次触摸它们(设置统一值除外)?
#1 楼
只要确保它们在两个着色器中的位置保持不变,就不需要重新绑定属性。 (通常在GLSL中使用layout(location = X)
语法,但如果前者不可用,也可以使用glBindAttribLocation
来完成。)均匀性是Shader Object状态的一部分,因此需要设置每个着色器至少一次。最小化此成本的一种方法是使用统一缓冲区对象,该对象将包含所有统一值,然后可以通过一次调用将其绑定到着色器。
评论
$ \ begingroup $
在您的UBO链接上:“最后,它们可用于在不同程序之间共享信息。因此,修改单个缓冲区可以有效地允许更新多个程序中的制服。”
$ \ endgroup $
– Zouch
17年2月2日在18:07
$ \ begingroup $
确保将现有缓冲区重用于相同的属性索引。
$ \ endgroup $
–像素
20 Jul 26'8:40