我见过的所有WebGL示例代码都调用gl.useProgram(),然后为每个帧设置每个统一的程序。问题是,你可以在WebGL项目中做的两件最昂贵的事情是运行Javascript和从Javascript到着色器的东西,这里的每个人每秒都做60次。另外,我知道我的大部分制服,在我自己的程序中,不会在帧与帧之间发生变化。 (这主要是轻微的位置等等,你可以混乱的东西,但通常不会。)
我的问题是,WebGL规范是否有任何关于制服价值保存多长时间的说法?如果我打电话给gl.useProgram(),我刚刚停止使用的程序是否会丢失它的制服?如果调用gl.useProgram()扰乱制服,我可以不是每一帧都调用它,并保留我的制服吗?
如果我可以强迫所有用户永远运行Firefox 22.0,我可以编写并运行一些测试代码,并且这个问题很明显。不幸的是...
答案 0 :(得分:2)
统一的值与特定程序相关联。它不会因为你切换到另一个程序而消失。 (我没有方便的参考指南。)
由于以下原因之一,你所看到的代码可能是每一帧都设置制服:
简单的懒惰:这肯定会奏效,其他事情需要考虑。
需要在每一帧中设置统一 的其他情况下的代码。
复杂的懒惰:通常很难准确定义参数的正确值更改的环境,因此每帧都要重新计算它。或者,弄清楚它是否需要改变甚至可能在计算上更加昂贵!
另外,每一帧做制服并不是那么糟糕,因为只有少数制服,而且数据不多。计算或复制顶点数组或其他每个场景对象的东西是你应该首先担心的事情。