重复关于 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);
正如 Nicol 指出的,在 WebGL 1.0 中,不,您不能拥有具有不同参数的相同纹理。您可以在 WebGL 2.0 中使用采样器对象(希望很快发货)。
我的问题是,为什么要为同一纹理使用不同的参数?作为一个从事大量商业视频游戏的人,我从来没有艺术家要求我这样做,所以我从来没有发现这是一个限制性的功能。
无论如何,如果您确实想在 WebGL 中执行此操作,则需要制作多个纹理,或者如果您不需要同时使用不同的参数,则需要在使用之间更改参数。