【问题标题】:webgl2 - Explanation for gl.TEXTURE0 ... nwebgl2 - gl.TEXTURE0 ... n 的解释
【发布时间】:2017-08-21 08:02:38
【问题描述】:

我发现 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]);

【问题讨论】:

    标签: webgl2


    【解决方案1】:

    如果 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2012-02-23
      • 2021-12-28
      相关资源
      最近更新 更多