更好地改变制服或改变计划?

jco*_*der 6 webgl

使用webgl我需要执行3次传递来渲染我的场景.每个过程都运行相同的几何体和着色器,但对于某些制服和纹理具有不同的值.

我似乎有两个选择.拥有一个"程序"并为每次传递设置所有制服和纹理.或者有3个"程序",每个程序包含相同的着色器,并为每个程序设置所有必要的制服/着色器,然后只需为每个过程切换程序.这意味着我将为每次传递执行一次useProgram调用,而不是每次传递的man setUniform调用.

这第二种技术可能会更快,因为它会避免很多setuniform调用,或者正在改变程序非常昂贵吗?我已经完成了一些试验,但是由于我目前看到的几何形状非常简单,我认为没有任何性能上的差异,因为设置成本压倒了任何差异.

是否有理由更喜欢一种技术而不是另一种?

小智 3

如果着色器程序相同,只需通过 glUniform 发送不同的值即可。

程序之间的切换通常比制服的改变值慢。无论如何,Uber Shader 程序(带有 useLighting、useAlphaMap 等制服列表)在大多数情况下都不好。

@gman 我们正在谈论没有 UBO 的 WebGL (GLES 2.0)。(统一缓冲对象)

@top Summing 尝试避免重新绑定着色器程序(但这不是世界末日)并且不要创建一个超级着色器!