2012-02-22 84 views
0

我正在開發2D遊戲項目,並且我想將openGl紋理包裝在一個簡單的類中。使用libpng從128x128px.png(使用Alpha通道)讀取紋理。由於代碼量非常大,我使用了pastebin。OpenGL 2D紋理不起作用

的代碼文件:

爲了避免浪費您的時間,我將解釋代碼一點點:

  • Texture類:對於一個OpenGL紋理的包裝。函數loadData在gl中設置紋理(這是我懷疑不起作用的函數)。

  • OpenGL的代碼:所述debugSetTexture函數將紋理,其中在graphicsDraw()函數中使用的變量temp。這是因爲它與main()不在同一個源文件中。在graphicsMainLoop()函數中,我使用Fork()函數,它實際上調用fork(),並存儲衍生進程的pid

main(),這是我做的:

Strategy::IO::PngReader reader ("/cygdrive/c/Users/Tibi/Desktop/128x128.png"); 
reader.read(); 
grahpicsInit2D(&argc, argv); 
debugSetTexture(reader.generateTexture()); 
graphicsMainLoop(); 
reader.close(); 

我試着叫gDEBugger的應用程序,並在貼圖瀏覽器,有生成的質感,但尺寸是0x0px。

我懷疑問題發生在使用Texture :: loadTexture()加載紋理時。

+0

爲什麼使用Cygwin?你在Cygwin環境中運行程序嗎? – AndiDog 2012-02-22 19:17:10

+0

「我懷疑Texture :: loadData()函數不起作用」......所以你試着在Texture類的最小范例中對相同的數據做同樣的事情?那樣有用嗎? – Bart 2012-02-22 20:01:54

+0

@AndiDog這是Eclipse配置的方式......我沒有安裝mingw,我不確定libpng是否存在於Windows上。 – Tibi 2012-02-22 20:21:19

回答

1

您需要在GL調用後檢查GL錯誤代碼。

例如此方法添加到您的類:

GLuint Texture::checkError(const char *context) 
{ 
    GLuint err = glGetError(); 
    if (err > 0) { 
    std::cout << "0x" << std::hex << err << " glGetError() in " << context 
    << std::endl; 
    } 
    return err; 
} 

然後調用它像這樣:

glBindTexture(GL_TEXTURE_2D, handle); 
checkError("glBindTexture"); 

假設它成功地加載png文件,假設你的程序在glBindTexture失敗? (強烈提示)

你確實爲你的文件處理調用了你的錯誤函數,但是你的程序是暫停還是繼續?

這是一個嚴重的問題:Texture PngReader :: generateTexture()通過值返回Texture。這將導致你的Texture對象在返回時(handle和all)被複制,然後〜Texture()被調用,從而破壞基於堆棧的副本。所以你的程序會調用glDeleteTextures幾次!

如果你想通過值返回它,你可以把它包裝在一個shared_ptr中,它可以做引用計數。這將導致析構函數只被調用一次:

#include <tr1/memory> 
typedef std::tr1::shared_ptr<Texture> TexturePtr; 

使用TexturePtr作爲返回類型。在像這樣在generateTexture()中初始化它:

TexturePtr t(new Texture); 

然後改變所有的方法訪問經歷 - >而不是。

+0

忘了提及錯誤功能輸出到日誌文件,如果有任何錯誤,就這樣,並且沒有錯誤出現。我也嘗試在內存中生成一個圖像(使用memset),但它也不起作用。我正在嘗試glGetError。 – Tibi 2012-02-22 20:41:40

+0

不,沒有...我沒有得到任何gl錯誤。 – Tibi 2012-02-22 20:46:06

+0

謝謝,這是問題...析構函數被調用,這是造成麻煩。 – Tibi 2012-02-22 21:13:07