5

我见过的所有 WebGL 示例代码都调用 gl.useProgram(),然后为程序设置每个制服,每帧一次。问题是,在 WebGL 项目中你可以做的最昂贵的两件事是运行 Javascript 行并将 Javascript 中的内容复制到着色器中,每个人每秒都做 60 次。另外,我知道我的大部分制服,在我自己的程序中,不会因帧而异。(主要是轻的位置等,你可以弄乱但通常不会弄乱的东西。)

我的问题是,WebGL 规范对制服的值保留多长时间有什么要说的吗?如果我调用 gl.useProgram(),我刚刚停止使用的程序是否会丢失它的制服?如果调用 gl.useProgram() 打乱了制服,我可以不每帧都调用它,并保留我的制服吗?

如果我可以强制所有用户永远只运行 Firefox 22.0,我可以编写并运行一些测试代码,并且很快就能解决这个问题。可悲...

4

1 回答 1

2

制服的价值与特定的程序相关联。它不会因为您切换到另一个程序而消失。(我手边没有规范参考。)

由于以下原因之一,您看到的代码可能是每帧都设置制服:

  • 简单的懒惰:这肯定会奏效,其他事情需要考虑。

  • 从其他需要每帧设置统一的情况复制代码

  • 复杂的惰性:通常很难准确定义参数正确值确实发生变化的情况,因此只需每帧重新计算即可。或者,确定是否需要更改可能在计算上更加昂贵!

此外,每帧都制作制服并没有那么糟糕,因为只有少数制服,而且数据不多。计算或复制顶点数组或其他每个场景对象的东西是你首先应该担心的事情。

于 2013-07-25T00:21:11.120 回答