2017-03-28 46 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