通常我在绘制网格之前加载所有统一变量(无论是否需要)。例如(在WebGL中):
gl.uniformMatrix4fv(program.ModelView, false, ModelView.array);
var MVP = Projection.mult(ModelView);
gl.uniformMatrix4fv(program.ModelViewProjection, false, MVP.array);
var NormalMatrix = ModelView.normal();
gl.uniformMatrix3fv(program.NormalMatrix, false, NormalMatrix);
gl.uniform3fv(program.materalDiffuse, materialDiffuse);
gl.uniform3fv(program.materalAmbient, [1.0, 1.0, 1.0]);
// ...etc...
// ... draw mesh via gl.drawArrays or gl.drawElements
自从之前调用gl.draw(Arrays|Elements)
以来,其中一些制服可能没有变化,因此加载它们通常是多余的。我应该担心这个开销吗?
我可以在客户端变量中添加dirty
位,只加载需要更改的统一变量; e.g:
if (ModelView.dirty || Projection.dirty) {
gl.uniformMatrix4fv(program.ModelView, false, ModelView.array);
var MVP = Projection.mult(ModelView);
gl.uniformMatrix4fv(program.ModelViewProjection, false, MVP.array);
ModelView.dirty = Projection.dirty = false;
}
每当dirty
或ModelView
发生变异时,我都会设置相应的Projection
位。
尝试限制统一变量加载是否值得努力?
答案 0 :(得分:1)
根据我的经验,与openGL相比,webGL中的统一更新有明显的开销。话虽这么说,你仍然可以期望每秒能够进行数千次这些统一更新,并且仍能达到60 FPS。
实际上,我认为对于大多数应用程序来说,如果您使用制服作为模型实例化的平均值,则统一更新只会成为一个问题。然后,由于统一的更新开销和所需的绘制调用数量的组合,您可能会遇到问题。
否则,我不会过分担心缓存制服。这样做当然不是一个坏主意,只是不要指望它成为让你从30 FPS升至60 FPS的神奇子弹。