0

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

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变量的潜在空虚。

4

1 回答 1

1

定义不好

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

所以,基本上这取决于你。如果您认为有一天您将需要多个 WebGL 上下文,那么最好不要让您的上下文使用全局变量。但是你总是可以回退到eglMakeCurrent编码风格。两者都有其优点和缺点。

于 2013-02-28T18:38:33.123 回答