如何处理纹理参数?

时间:2016-09-21 21:40:49

标签: textures webgl

在HTML5中,我正在处理将纹理加载到WebGL上下文的页面。但是,这个问题可能适用于任何OpenGL(ES)版本。

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

但是,我不清楚这些参数实际设置的对象是什么。它们是否设置为在当前活动纹理槽中启用的实际纹理?它们是否设置为当前活动的纹理槽本身?或者它们是否针对所有纹理进行了全局设置?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);

正如Nicol指出的那样,在WebGL 1.0中,没有,你不能拥有不同参数的相同纹理。您可以在WebGL 2.0中使用采样器对象(希望很快发货)。

我的问题是,为什么你想要相同纹理的不同参数?作为一个在一堆商业视频游戏中工作的人,我从来没有一个艺术家要求我这样做,所以我从未发现这是一个限制性功能。

在任何情况下,如果您确实想在WebGL中执行此操作,如果您不需要同时使用不同的参数,则需要制作多个纹理或更改使用之间的参数。