2012-04-28 69 views
2

我正在使用WebGL(≈OpenGL ES 2.0)。目前,我的应用程序使用纹理单元0作为每个模型的纹理,以及1和2作为着色器使用的常量纹理。我应该如何在初始化纹理时管理glActiveTexture?

为了加载和设置纹理,我

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

然而,这跺脚在其上的纹理结合到当前的纹理单元的状态。为了避免这个程序中,我添加

gl.activeTexture(gl.TEXTURE0); 

上述代码的开始,以使得它仅影响针对其无论如何绘制任何几何形状之前重置纹理单元0的结合。

是否有更好的方法,即不涉及发生有“划痕”纹理单元的情况?对于这种国家管理问题,是否有一个确定的最佳做法?

回答

1

对于我来说,这个问题与其他几个属于同一个类别:在程序中的某些点上,你可以假定GL状态?

AFAICT你基本上有两种选择:

  1. 麻痹大意,并设置状态,你需要的方式。即拨打glActiveTextrure(),因为您目前正在做
  2. 为您的程序中的某些点设置GL应该处于什么状态的规则。例如对于您的情况,绘图部分在完成时调用glActiveTexture(gl.TEXTURE0),因此预绘图部件可以假定它是以这种方式设置的。

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

+0

谢谢,但我不是问“主动纹理单元的策略应该是什么?” - 我已经遵循了你所描述的原则 - 但是“我应该如何初始化纹理,尽量不干扰我对纹理单元的其他用途?”,这可能意味着对规则的限制。 – 2012-04-28 17:26:56

+0

你可以把它当作我正在谈论的另一个实例。在GL中有很多状态可以像这样“踩踏”。你可以为该工作使用单独的纹理单元,这意味着你不必重置任何东西,但必须调用'glActiveTextureUnit()'两次。或者你可以摧毁当前的纹理单元,然后将设置纹理状态的责任传递给绘图部分。无论哪种方式,你的程序的一部分(有点)有一些额外的工作要做。 – 2012-04-28 17:35:12

+0

从某种角度来看,它可以归结为效率和可维护性之间的一个小的折衷。 – 2012-04-28 17:37:34