2016-09-21 106 views
0

在HTML5中,我正在将纹理加载到WebGL上下文的页面上工作。但是,这个问题可能对任何OpenGL(ES)版本都是通用的。纹理参数如何处理?

将纹理上传到GPU后(通过glBindTextureglTexImage2D),可以调用glTexParameteriglTexParameterf函数。这些函数应该为纹理设置参数。

但是,我不清楚这些参数实际设置的是什么对象。它们是否设置为实际纹理,它在当前活动的纹理槽中启用?它们是否设置为当前活动的纹理槽本身?还是他们在全球范围内设置所有纹理?

由此产生的另一个疑问是: 我可以在多个纹理槽中使用不同的参数启用相同的纹理(只在GPU上加载一次)吗?

回答

0

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

1

根据OpenGL 3.x+ nomenclature(由ES和WebGL共享),形式glTex*的所有函数修改了与给定纹理目标绑定到当前纹理单元的纹理对象。

您可以将相同的纹理绑定到不同的纹理单元。但是你不能给它不同的参数。如果您想使用具有相同纹理的不同采样参数, 您必须使用 Sampler Objects 您在WebGL中运气不佳。