webgl2 - gl.TEXTURE0 ... n 的解释

webgl2 - Explanation for gl.TEXTURE0 ... n

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

我在 mozilla 开发站点上找到:"GL provides 32 texture registers; the first of these is gl.TEXTURE0" .

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

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

或:

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

如果 Mozilla 的网站说

"GL provides 32 texture registers

网站有误

WebGL 和 WebGL2 拥有与 driver/GPU 支持的一样多的纹理单元。不过,WebGL1 和 WebGL2 都有一个最小数量。 WebGL1 为 8(8 个片段着色器纹理和 0 个顶点着色器纹理),WebGL2 为 32(16 个片段着色器纹理和 16 个顶点着色器纹理)

所以,最好从第 0 单元开始学习。如果您需要在 WebGL1 上使用超过 8 个或在 WebGL2 中使用超过 32 个,您应该查询可用的数量,然后告诉用户他们不能使用您的网站或回退到一些在最低限度内工作的更简单的方法。

至于更大的数字,使用

更容易
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