2

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

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

WebGL 浏览器泄漏报告

4

2 回答 2

3

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 允许多个阶段访问纹理。

于 2017-03-25T23:37:58.417 回答
3

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

请注意,WebGL1 中的最小值为MAX_VERTEX_TEXTURE_IMAGE_UNITS0。这意味着在顶点着色器中使用纹理是 WebGL1 的可选功能。幸运的是,大多数设备至少支持 4

于 2019-01-31T10:01:18.483 回答