2012-03-08 35 views
0

我想設置一個簡單的函數,這將使我更容易在OpenGL中紋理貼圖幾何體,但由於某些原因,當我試圖製作天空盒時,我得到的是白色方塊而不是紋理映射幾何。我認爲problemed代碼位於以下範圍內:OpenGL紋理:爲什麼命令很重要?

void MapTexture (char *File, int TextNum) { 
    if (!TextureImage[TextNum]){ 
     TextureImage[TextNum]=auxDIBImageLoad(File); 
     glGenTextures(1, &texture[TextNum]); 
     glBindTexture(GL_TEXTURE_2D, texture[TextNum]); 
     glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    } 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, texture[TextNum]); 
//glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[TextNum]->sizeX, TextureImage[TextNum]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[TextNum]->data); 
//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 

} 

最重要的事情,我不明白的是由於某種原因glBindTexture()一定要來glGenTextures()glTexImage2D之間。如果我把它放在其他地方,它將所有東西都擰緊。什麼可能導致這個問題?對不起,如果它很簡單,我是全新的OpenGL。

下面是我說的白牌的截圖: enter image description here

++++++++++++++++++++++++++++ +++ 編輯 +++++++++++++++++++++++++++++++

在代碼中多玩一會兒之後,我意識到如果我在最後的glBindTexture()之後添加glTexImage2D()glTexParameteri(),那麼所有紋理都會加載。爲什麼沒有這兩行代碼就會加載大多數紋理,但是還有一些不會,以及爲什麼我必須爲每一幀調用glTexImage(),但僅限於幾個紋理?

+1

「auxDIBImageLoad」請不要使用'GLaux'永遠。如果你需要加載圖片,那麼[很多實際上很好的圖書館](http://www.opengl.org/wiki/Image_Libraries)。 – 2012-03-08 16:25:29

+0

我問這個的原因其實主要是因爲我在嘗試加載紋理時得到這個白色框,我認爲這可能與這些函數的排序有關,但似乎並非如此。還有什麼可能導致這個白盒出現? – Sean 2012-03-09 03:00:08

+0

我認爲這與訂單有關,因爲如果我要刪除'if(!TextureImage [TextNum])',那麼紋理將會出現,但考慮到每當該框架被調用時調用MapTexture呈現,沒有'if(!TextureImage [TextNum])'內存泄漏像瘋狂,直到程序崩潰。 – Sean 2012-03-09 03:09:41

回答

8

是的,訂單絕對重要。

  • glGenTexture創建紋理名稱。

  • glBindTexture需要glGenTexture生成的紋理名稱,所以它不能在glGenTexture之前運行。

  • glTexImage2D將數據上傳到當前綁定的紋理,因此無法在glBindTexture之前運行。

OpenGL的客戶端接口是Big Giant Squgly狀態機。有很多參數和標誌可以改變,你必須小心謹慎才能使OpenGL保持正確的狀態。這通常意味着您推送的彈出矩陣,並恢復您修改的標誌(至少在OpenGL 1.x中)。

4

OpenGL是一個狀態機,這意味着你可以拉動它的手柄,旋轉它的旋鈕,它將保持這些設置,直到你主動改變它們。

但是它也管理對象中的持久數據。 這樣的對象是抽象的,不能與屏幕上看到的對象混淆! 現在OpenGL通過其所謂的標識對象名稱,一個數字ID。你創建一個(名單)(名單) - 但不是對象(多個)! - glGenTextures用於紋理對象,這是一種OpenGL對象。

爲了消除這樣的對象,OpenGL必須首先進入一個狀態,以下所有調用操作此類對象的調用都發生在一個特定的對象上。這是通過glBindTexture完成的。在調用glBindTexture之後,以下所有調用紋理的調用都發生在您剛剛綁定的那個紋理對象上。如果該對象先前不存在,則在第一次綁定新分配的對象名稱時創建該對象。 現在OpenGL使用那個特定的對象。

glTexImage2D只是用於管理當前綁定紋理的數據的幾個函數之一。


否則您的功能指向正確的方向。 OpenGL沒有真正的初始化階段,你只是在做事情。延遲加載數據直到你需要它是有意義的。但在實際繪製框架之前,對對象列表進行多次迭代也是有意義的。其中一個準備應該是,你遍歷所有的對象(現在不是OpenGL,但你的)來測試數據是否已經加載。如果仍然缺少大量數據,請改爲繪製加載屏幕,以免用戶獲得程序掛起的印象。甚至可能在單獨的線程中執行冗長的加載操作,但對於OpenGL,這需要一些預防措施。