webgl2 - gl.TEXTURE0 ... n的说明

时间:2017-03-28 09:53:10

标签: webgl2

我发现gl.TEXTURE0的调试器编号.... 31。 0 + 31 = 32 纹理有32个对象,但我只有一个纹理。

我在mozilla dev网站上找到:“GL提供32个纹理寄存器;第一个是gl.TEXTURE0”

当我使用下一个(第二个tex)时,我使用了:

Android 7.0

或:

  gl.activeTexture(gl.TEXTURE0);
  gl.bindTexture(gl.TEXTURE_2D, textures[0]);
  gl.activeTexture(gl.TEXTURE1);
  gl.bindTexture(gl.TEXTURE_2D, textures[1]);

1 个答案:

答案 0 :(得分:3)

如果Mozilla的网站说

  

" GL提供32个纹理寄存器

网站错误

WebGL和WebGL2具有与驱动程序/ GPU支持的纹理单元一样多的纹理单元。 WebGL1和WebGL2都有最小数量。 WebGL1是8(8个片段着色器纹理和0个顶点着色器纹理),WebGL2是32(16个片段着色器纹理和16个顶点着色器纹理)

所以,最好从第0单元开始并开始工作。如果你需要在WebGL2上使用8个以上或在WebGL2中使用超过32个,你应该查询可用的数量,并告诉用户他们不能使用你的网站或回退到一些在最小值范围内工作的简单方法。 / p>

至于更高的数字,使用

更容易
var unit = ???;
gl.activeTexture(gl.TEXTURE0 + unit);
...

因为它与设置采样器制服所需的相匹配

// bind a texture to texture unit 7
var unit = 7;
gl.activeTexture(gl.TEXTURE0 + unit);
gl.bindTexture(gl.TEXTURE_2D, someTexture);

// and tell some sampler uniform to use texture unit 7
gl.uniform1i(someSamplerUniformLocation, unit);

如果您的使用量不超过最低限度,则无需查询。如果您使用的数量超过最小值,则可以通过调用

进行查询
 const maxVertexTextureUnits = gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
 const maxFragmentTextureUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
 const maxCombinedTextureUnits = gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);

MAX_COMBINED_TEXTURE_IMAGE_UNITS是第一个2的绝对最大值。在WebGL1中它是8.在WebGL2中它是32。它的含义例如是让我们在WebGL1中说

MAX_VERTEX_TEXTURE_IMAGE_UNITS   = 4
MAX_TEXTURE_IMAGE_UNITS          = 8
MAX_COMBINED_TEXTURE_IMAGE_UNITS = 8

这意味着最多可以使用8个单位。其中,顶点着色器中最多可以使用4个,片段着色器中最多可以使用8个,但使用的总数不能超过8.因此,如果在顶点着色器中使用2,则可以仅使用6个链接片段着色器,总共8个。

检查webglstats.com我看到很多GPU支持64个组合纹理单元,顶点着色器中有32个,片段着色器中有32个。

对于绑定纹理,您可以为特定的绘制调用绑定它们。换句话说,你可以拥有1000个纹理,但是你只能在一次绘制调用中使用MAX_COMBINED_TEXTURE_IMAGE_UNITS

典型地

 pseudo code
 for each thing you want to draw
    use program for thing
    set attributes (bind a vertex array) for thing
    set uniforms and bind textures for thing
    draw