2016-09-21 105 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中運氣不佳。