在OpenGL中加载统一变量是否昂贵?

时间:2015-09-22 17:13:58

标签: performance opengl-es webgl

通常我在绘制网格之前加载所有统一变量(无论是否需要)。例如(在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;
}

每当dirtyModelView发生变异时,我都会设置相应的Projection位。

尝试限制统一变量加载是否值得努力?

1 个答案:

答案 0 :(得分:1)

根据我的经验,与openGL相比,webGL中的统一更新有明显的开销。话虽这么说,你仍然可以期望每秒能够进行数千次这些统一更新,并且仍能达到60 FPS。

实际上,我认为对于大多数应用程序来说,如果您使用制服作为模型实例化的平均值,则统一更新只会成为一个问题。然后,由于统一的更新开销和所需的绘制调用数量的组合,您可能会遇到问题。

否则,我不会过分担心缓存制服。这样做当然不是一个坏主意,只是不要指望它成为让你从30 FPS升至60 FPS的神奇子弹。