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