2017-03-28 21 views
0

我发现了gl.TEXTURE0 ....的调试器编号。 0 + 31 = 32 纹理的32个对象,但我只有一个纹理。webgl2 - gl.TEXTURE0 ...的解释... n

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

回答

2

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