2012-10-25 43 views
16

好吧,所以這些紋理真的讓我困惑。我一直在尋找this教程(我認爲它很棒),特別是圖片上標題爲「您最多可以定義32個紋理單元,但每個着色器最多可以定義8個紋理。」。據我瞭解,它是如何工作的:OpenGLES 2 - 何時glBindTexture,何時glActiveTexture?

你激活一個紋理單元。然後將紋理對象(類似於圖像中的「紋理數據」立方體)綁定到該單元內的某個目標。因此,glGenTextures使對象&獲得它們的名稱,然後glBindTexture將該紋理綁定到TEXTURE_2D或其他東西(我目前對其他目標不感興趣)。然後你可以用glTexImage2D指定紋理數據。

現在。我正在使用3個着色器程序,每個程序都需要不同的紋理。這是我想做的事:

在初始化階段,我通過我的每一個紋理單元,以及去

  • glActiveTexture
  • glBindTexture(活動紋理單元上操作)
  • glTexImage2D(運行在當前綁定對象)

和用於着色器,我glUniform在每個着色均勻匹配到「I」值。在glActiveTexture的GL_TEXTUREi指定。我只需要四個紋理,而且它們非常小。

現在,在渲染過程中,我應該可以切換程序,並且一切正常,對不對?每個程序都有一個統一的規定要使用哪個單元,每個單元已經有一個綁定到它的TEXTURE_2D目標的對象,並且每個對象都有由glTexImage2D指定的數據,對吧?所以我的渲染功能中不需要綁定或激活單元?至少我是這麼理解的,但是我在錯誤的地方得到了錯誤的紋理。

此外,在我的一個程序中,我想在單個曲面的三個紋理之間切換。所以我想我把每個紋理加載到一個對象中,並將每個對象綁定到一個單元,然後在渲染的時候,我可以通過glUniform來告訴程序使用哪個紋理單元。

所以我想知道我是否誤解了OpenGL中紋理的基本結構,或者當程序切換時對象與單元的綁定是否到期,或者類似的東西。或者我是否必須多次綁定紋理 - 但是何時,爲什麼?

+1

這聽起來像你有正確的想法,我沒有看到缺陷。也許你可以提出一個**最小的例子,在這個例子中你畫出了錯誤的紋理,以便我們看看你是否犯了錯誤? – Tim

+1

當我遇到類似的問題時,我查看了這個問題。我的問題是由於一個靜態變量,不應該是靜態的。我正在爲iOS開發,我能夠在Xcode中使用OpenGL調試器來弄清楚它。不知道你是否在iOS上,但如果你剛開始使用教程,我認爲指出這個調試器會很有幫助: http://developer.apple.com/library/mac/#recipes/ xcode_help-debugger/articles/debugging_opengl_es_frame.html – GingerBreadMane

+0

@Shitesh - 你曾經解決過你的問題嗎? – nbubis

回答

11

不要忘記爲每個紋理對象設置glTexParameteri。

void loadTextures() { 
    GLint texture_object_handles[3]; 
    glGenTextures(3, texture_object_handles); 

    for (int i = 0 ; i < 3 ; ++i) { 
     glActiveTexture(GL_TEXTURE0 + i); 
     glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexImage2D(GL_TEXTURE_2D, ...); 
    } 
    return; 
} 


void draw() { 
    // Draw three different materials without rebinding any textures. 
    for (i = 0 ; i < 3 : ++i) { 
     ... specify other uniforms and attributes 
     glUniform1i(texture_location, i); 
     ... 
     glDrawElements(...); 
    } 
    return; 
}  
+0

請注意,MAG_FILTER的默認值是GL_LINEAR,所以您不必設置它。 – Tim

+0

謝謝。改變它以使示例更簡潔。 – umlum