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