使WebGL上下文对象成为全局/半全局变量是一个坏主意吗?

时间:2013-02-27 15:05:01

标签: webgl

所以,我的想法是做那样的事情(代码当然是简化的):

var gl;

function Renderer(canvas) {
     gl = this.gl = canvas.getContext('experimental-webgl');
}

function Object() {
}

Object.prototype.render = function() {
    ...
    gl.drawElements(...);
}

gl变量本身可以放入命名空间以获得更好的一致性,也可以通过将所有代码包装到匿名函数中来确保它不会与任何内容发生冲突。

我可以在这里看到一个明显的权衡:在同一页面上运行多个WebGL画布的问题。但我对它完全没问题。

为什么这样做?因为否则调用任何WebGL函数会更加痛苦,您必须将渲染器作为参数传递到此处。这实际上是我不喜欢的Three.js:所有图形内容都在Renderer对象中处理,这使整个Renderer对象变得庞大而复杂。

如果使用全局可见的上下文,您不必担心OpenGL常量,您不必担心渲染器对象的可见性,等等。

所以,我的问题是:我应该期待这种方法的陷阱吗?当然,除了gl变量的潜在空虚之外。

1 个答案:

答案 0 :(得分:1)

定义错误

很多WebGL程序都是这样做的。 OpenGL默认执行此操作,因为函数的范围是全局的。在普通的OpenGL中,您必须调用eglMakeCurrent(或等效的)来切换上下文,这实际上只是隐藏gl = contextToMakeCurrent

所以,基本上由你决定。如果您认为有一天您将需要多个WebGL上下文,那么不要让您的上下文使用全局变量可能是明智之举。但是你总是可以回归到eglMakeCurrent编码风格。两者都有其优点和缺点。