2

我正在使用 WebGL (≈ OpenGL ES 2.0)。目前,我的应用程序使用纹理单元 0 作为每个模型的纹理,并将 1 和 2 作为着色器使用的常量纹理。

为了加载和设置纹理,我做

var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(...);
gl.texParameteri(...);

但是,这会影响纹理绑定到当前纹理单元的状态。为了避免这个程序,我添加了

gl.activeTexture(gl.TEXTURE0);

到上述代码的开头,因此它只影响纹理单元 0 的绑定,该绑定在绘制任何几何图形之前被重置。

有没有更好的方法,即不涉及碰巧有可用的“临时”纹理单元?是否有针对此状态管理问题的既定最佳实践?

4

1 回答 1

1

对我来说,这个问题与其他一些问题属于同一类别:您可以假设程序中某些点的 GL 状态是什么?

AFAICT你基本上有两种选择:

  1. 什么都不做,按照你需要的方式设置状态。即glActiveTextrure()像你现在正在做的那样打电话
  2. 为 GL 在程序中的某些点应该处于什么状态设置规则。例如,对于您的情况,在完成后调用绘图部分glActiveTexture(gl.TEXTURE0),因此预绘图部分可以假设它是这样设置的。

但真的,不要想太多。在 OpenGL 中,您可以通过最大化(在某些实际限制内)多边形与函数调用的比率来优化程序,您也可以通过传递大量多边形来进行glDrawArrays()调用等来做到这一点。

于 2012-04-28T17:18:44.133 回答