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

让WebGL上下文对象成为全局/半全局变量是个坏主意吗?,webgl,Webgl,因此,我的想法是这样做(代码当然是简化的): gl变量本身可以放在名称空间中以获得更好的一致性,也可以通过将所有代码包装到匿名函数中来封装它,以确保它不会与任何内容冲突 我可以看到一个明显的折衷:在同一页面上运行多个WebGL画布存在问题。但我完全同意 为什么这么做?因为否则调用任何WebGL函数都会更痛苦,所以必须在此处或那里将渲染器作为参数传递。这实际上是我不喜欢Three.js的地方:所有的图形内容都在渲染器对象内部处理,这使得整个渲染器对象庞大而复杂 如果使用全局可见的上下文,则不必担心

因此,我的想法是这样做(代码当然是简化的):

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

我可以看到一个明显的折衷:在同一页面上运行多个WebGL画布存在问题。但我完全同意

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

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


所以,我的问题是:我是否应该期待这种方法会有陷阱?当然,除了
gl
变量可能为空之外。

定义坏的

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

所以,基本上由你决定。如果您认为有一天您将需要多个WebGL上下文,那么最好不要让上下文使用全局变量。但是您可以始终回退到
eglmakefrent
编码风格。两者各有优缺点

var gl;

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

function Object() {
}

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