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