簡單的 OpenGL 紋理貼圖不起作用?

itchaindev發表於2022-04-04

問題

我正在嘗試找出 OpenGL 中的紋理對映,但我找不到一個簡單的例子來工作。

正在繪製多邊形,雖然它沒有紋理,而只是純色。此外,點陣圖也被正確載入到 sprite1[] 中,因為到目前為止我一直在成功使用 glDrawPixels。

我使用 glGenTextures 來獲取我的 tex 名稱,但我注意到它並沒有改變 texName1; 這個 GLuint 是我初始化它的任何東西,即使在呼叫 glGenTextures 之後……

我已啟用 GL_TEXTURE_2D。

繼承人的程式碼:

GLuint texName1 = 0;glGenTextures(1, &texName1);glBindTexture(GL_TEXTURE_2D, texName1);glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);glColor3f(1, 1, 0);glBindTexture(GL_TEXTURE_2D, texName1);glBegin(GL_QUADS);glTexCoord2f (0.0, 0.0);glVertex3f (0.0, 0.0, -5.0f);glTexCoord2f (1.0, 0.0);glVertex3f (.5, 0.0, -5.0f);glTexCoord2f (1.0, 1.0);glVertex3f (.5, .5, -5.0f);glTexCoord2f (0.0, 1.0);glVertex3f (0.0, .5, -5.0f);glEnd();

更新:我不知所措。這是我嘗試過的所有內容:

  1. 原來我是在初始化 OGL 之前初始化我的紋理。紋理在類建構函式中初始化(glGenTextures->glTexImage2D)並在每幀呼叫的成員函式中繪製(glBegin->glEnd)。genTextures 現在似乎工作正常,我的名字是 1。

  2. GL_RGBA8、GL_BGRA_EXT 的所有可能組合(GL_BGRA 在我的系統上不起作用;我需要 _EXT),我什至從點陣圖中刪除了 alpha 通道並嘗試了 GL_RGB、GL_BGR_EXT 等的所有組合。沒有運氣。

  3. 嘗試以程式方式建立點陣圖並使用它

  4. 確保 GL_COLOR_MATERIAL 未啟用。

  5. 將點陣圖大小更改為 32×32。

  6. 嘗試了 glTexEnvi 而不是 glTexEnvf。

解決方法

要檢查的第一件事是顏色材料設定,如 ShadowIce 所述,然後檢查您的紋理檔案以確保其大小合理(例如 256×256)和 RGB 點陣圖。如果檔案有輕微的問題,無論您如何嘗試,它都不會正確呈現。

然後,我將停止嘗試僅除錯該程式碼,而是檢視您與 NeHe 網站上的教程有什麼不同。

NeHe 始終是檢查您是否嘗試在 OpenGL 中做事的好地方。紋理可能是最難做到的事情,而且隨著你其他 GL 技能的提高,它們只會變得更加困難。

我的 OpenGL 生鏽了,但我記得與 glTexImage2D
. 最後我設法讓它工作,但我總是有更多的運氣,  gluBuild2DMipmaps
所以我最終得到了

gluBuild2DMipmaps (GL_TEXTURE_2D, type, i.width, i.height, type, GL_UNSIGNED_BYTE, i.data);

取代

glTexImage2D (GL_TEXTURE_2D, 0, type, i.width, i.height, 0, type, GL_UNSIGNED_BYTE, i.data);

  一些隨機的想法:

  • GL_COLOR_MATERIAL 可能已啟用
  • 將“glTexEnvf”更改為“glTexEnvi”,看看是否有幫助
  • 如果在 glGenTextures 之後 texName1 為 0,您可能沒有活動的 OpenGL 上下文

對於錯誤檢查,我建議編寫一個小函式,列印來自 glGetErrors 的最常見結果的可讀輸出,並使用它來查詢產生錯誤的行。另一種可能性是使用GLIntercept、BuGLe或gDEBugger之類的東西。

除了mentat 指出您可能對非二次冪紋理尺寸有問題之外,您還提到紋理名稱生成不會更改名稱。

這聽起來好像您呼叫 glGenTextures()得太早了,即在初始化 OpenGL 之前。如果你不是,那麼我建議在呼叫 glGenTextures()檢查 OpenGL 錯誤狀態之後新增程式碼,方法是呼叫 glGetError().

 文章來源: 簡單的 OpenGL 紋理貼圖不起作用?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016198/viewspace-2885671/,如需轉載,請註明出處,否則將追究法律責任。

相關文章