从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的,你需要做多重纹理或改变用途的参数,如果你不同时需要不同的参数。