2014-10-16 70 views
0

我正在開發一個用於ios的opengl es應用程序。 我想在我的着色器中混合兩種紋理,但我總是隻能得到一個活動紋理單元。 我已經生成了兩個紋理,並將它們與片段着色器中的兩個「sampler2D」鏈接起來。我使用glUniform1f()將它們設置爲單元0和1;ios,opengl es2.0。,使用多個紋理,但只得到一個有效的紋理單元

我已使用循環

for (int i = 0; i < 2; i++) 
{ 
    glActiveTexture(GL_TEXTURE0 + i); 
    glBindTexture(GL_TEXTURE_2D, textures[i]); 
} 

結合紋理但是,當我繪製的OpenGL幀中,只有一個單元是活動的。如下圖所示 debug window in xcode using capture GPU frame

那麼,我一直在做什麼錯了?

回答

0

我讀取該工具的輸出(我沒有使用它)的方式,左窗格顯示當前活動的紋理單元。始終只有一個活動紋理單元,對應於您最後一次撥打glActiveTexture()。這意味着,在你撥打:

glActiveTexture(GL_TEXTURE0 + i); 

左盤旋字段中的值將是i值。

右側窗格顯示綁定到每個紋理單元的紋理。由於您使用問題中顯示的循環將紋理綁定到單元0和1,因此它會顯示綁定到紋理單元0的紋理(id爲201)以及綁定到紋理單元1的紋理(id爲202)。

所以就我所知,屏幕截圖中顯示的狀態完全代表您根據您的描述和代碼片段設置的內容。

根據您的問題的措辭,您可能會覺得glActiveTexture()啓用紋理單元。事實並非如此。 glActiveTexture()僅指定後續調用哪個紋理單元glBindTexture()

然後使用哪些紋理由您爲着色器程序的採樣器制服設置的值以及綁定到相應紋理單元的紋理確定。當前激活的紋理單元的值對繪製調用沒有影響,僅在紋理綁定上有效。