1

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

我在 mozilla 开发网站上找到:“GL 提供 32 个纹理寄存器;其中第一个是 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]);
4

1 回答 1

3

如果 Mozilla 的网站说

"GL 提供 32 个纹理寄存器

该网站是错误的

WebGL 和 WebGL2 具有驱动程序/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
于 2017-03-28T15:58:13.250 回答