從SO上重複約5個其他答案,但...
紋理操作像這樣工作。有一組紋理單元
internalGLState = {
activeTextureUnit: 0,
textureUnits: [
{ TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, },
{ TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, },
{ TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, },
{ TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, },
{ TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, },
{ TEXTURE_2D: ?, TEXTURE_CUBEMAP: ?, },
...
],
};
紋理由當前活動紋理單元和該單位綁定點引用全球。
所以,gl.activeTexture
有效地做到這一點
gl.activeTexture = function(unitId) {
internalGlState.activeTextureUnit = unitId - gl.TEXTURE0; // conver to index
}
所有其它質地的功能這樣
function getTexture(bindPoint) {
return internalGLState[internalGlState.activeTextureUnit][bindPoint];
}
基本工作,以便例如gl.texParameteri
gl.texParameteri = function(bindPoint, settingId, value) {
var texture = getTexture(bindPoint);
texture.internalApplySetting(settingId, value);
}
的設置上紋理。的「紋理單元」僅僅是有效的引用的陣列以紋理(除了有一個爲每單位每綁定點一個參考)
着色器由紋理單元的索引
gl.uniform1i(someSamplerUniformLocation, textureUnitIndex);
作爲尼科爾參考紋理在WebGL 1.0中指出,不,你不能擁有與不同參數相同的紋理。您可以在WebGL 2.0中使用採樣器對象(很快就會發布)。
我的問題是,爲什麼你想要相同的紋理不同的參數?作爲一個在一羣商業視頻遊戲上工作的人,我從未有過一位藝術家要求我這樣做,所以我從來沒有發現它是一個限制性功能。
在任何情況下,如果你想做到這一點在WebGL的,你需要做多重紋理或改變用途的參數,如果你不同時需要不同的參數。