【问题标题】:What is the Difference Between WebGL 2.0 Max Image Texture Units and Max Combined Texture Units?WebGL 2.0 最大图像纹理单元和最大组合纹理单元有什么区别?
【发布时间】:2017-03-25 22:26:33
【问题描述】:

我目前正在开发一个 GLSL 着色器,该着色器使用大量纹理文件将多个材质相互叠加,这些材质被每个图层的 alpha 混合图像单独屏蔽。该效果应该模仿具有背衬、中间网格和顶部第三个网格的织物。在处理这个问题时,我很快就遇到了着色器中纹理单元的限制。作为一种解决方案,我将开始将纹理组合到 RGB 通道中,以获得更多可供着色器使用的纹理,并研究将多个漫反射图像或其他图像组合成一个图像。但与此同时,我的问题是:

WebGL 2.0 是否会提供更多的纹理单元,或者这是显卡本身的限制?就像一个常识性问题一样,最大组合纹理单元数是我在 WebGL 上下文中可以拥有的纹理单元总数吗?这与 Max Texture Units 有何不同?我只是想了解这里的限制。以下是我的 Macbook Pro 上针对 WebGL 的 Browserleaks 的结果。

【问题讨论】:

    标签: glsl webgl webgl2


    【解决方案1】:

    WebGL 2.0 是否会提供更多的纹理单元,或者这是显卡本身的限制?

    这是硬件限制。

    最大组合纹理单元数是我可以在 WebGL 上下文中拥有的纹理单元总数吗?

    是的。

    这与 Max Texture Units 有何不同?

    GL_MAX_TEXTURE_IMAGE_UNITS应用于片段着色器访问的纹理。 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 指定可跨所有着色器阶段访问的纹理总数。

    WebGL 1.0 不允许非 FS 阶段访问纹理。 WebGL 2.0 允许多个阶段访问纹理。

    【讨论】:

    • WebGL 1.0 确实允许非 FS 阶段访问纹理。它只是将所需的最小值设置为 0。According to weblstats.com 98.3% of WebGL1 devices support at least 4 textures in vertex shaders.
    • MAX_COMBINED_TEXTURE_IMAGE_UNITS =35661 MAX_TEXTURE_IMAGE_UNITS =34930 MAX_VERTEX_TEXTURE_IMAGE_UNITS =35660 我正在寻找片段着色器纹理样本的最大数量等。8、16、32 ....我得到的只是大数字!
    • @NikolaLukic:这些是 枚举器 的值,而不是您从 glGetIntegerv 获得的值。后者是从实现中获取的实际值。
    • WebGL 中没有glGetIntegerv
    【解决方案2】:

    MAX_COMBINED_TEXTURE_IMAGE_UNITS 是存在的纹理单元的总数。

    MAX_TEXTURE_IMAGE_UNITS 是您可以在片段着色器中使用的纹理单元总数

    MAX_VERTEX_TEXTURE_IMAGE_UNITS 是您可以在顶点着色器中使用的纹理单元总数

    您可以通过调用gl.getParameter查询这些值

    function main(webglVersion) {
      const gl = document.createElement('canvas').getContext(webglVersion);
      if (!gl) {
        return console.log('no', webglVersion);
      }
      console.log(webglVersion);
      console.log(
        'MAX_COMBINED_TEXTURE_IMAGE_UNITS',
        gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS));
      console.log(
        'MAX_TEXTURE_IMAGE_UNITS',
        gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS));
      console.log(
        'MAX_VERTEX_TEXTURE_IMAGE_UNITS',
        gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS));
    }
    main('webgl');
    main('webgl2');

    假设你得到了这些结果

    MAX_COMBINED_TEXTURE_IMAGE_UNITS 20
    MAX_TEXTURE_IMAGE_UNITS 8
    MAX_VERTEX_TEXTURE_IMAGE_UNITS 16
    

    这意味着您在顶点着色器中最多可以使用 8 个,在片段着色器中最多可以使用 16 个,但总共不能使用超过 20 个。

    WebGL 2.0 是否会提供更多的纹理单元,或者这是显卡本身的限制?

    WebGL 2.0 要求的最小值高于 WebGL1 的最小值。通常在同一个 GPU 上,它们很可能提供相同的数量,但有些 GPU 支持 WebGL1,但不支持 WebGL2

    WebGL 与 WebGL2 的最低保证值

                                       WebGL1  WebGL2
    MAX_COMBINED_TEXTURE_IMAGE_UNITS     8       32
    MAX_TEXTURE_IMAGE_UNITS              8       16
    MAX_VERTEX_TEXTURE_IMAGE_UNITS       0       16
    

    请注意,MAX_VERTEX_TEXTURE_IMAGE_UNITS 在 WebGL1 中的最小值为 0。这意味着在顶点着色器中使用纹理是 WebGL1 的可选功能。幸好most devices support at least 4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多