[英]OpenGL 2d texture not working
我正在研究2D游戲項目,我想將openGl紋理包裝在一個簡單的類中。 使用libpng從128x128px .png(具有alpha通道)讀取紋理。 由於代碼量很大,因此我使用了pastebin。
代碼文件:
為了避免浪費您的時間,我將解釋一下代碼:
Texture類 :OpenGL紋理的包裝器。 loadData
函數在gl中設置紋理(我懷疑這是行不通的函數)。
OpenGl代碼 : debugSetTexture
函數將紋理放入temp
變量中,該變量在graphicsDraw()
函數中使用。 這是因為它與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()加載紋理時會發生問題。
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中失敗了? (強烈提示)
您確實調用了Error函數來處理文件,但是程序隨后會暫停還是繼續運行?
這是一個嚴重的問題:Texture PngReader :: generateTexture()按值返回Texture。 這將導致您的Texture對象在返回時被復制(句柄和全部),然后調用〜Texture(),從而破壞了基於堆棧的副本。 因此,您的程序將多次調用glDeleteTextures!
如果要按值返回,可以將其包裝在shared_ptr <>中,該引用進行引用計數。 這將導致析構函數僅被調用一次:
#include <tr1/memory>
typedef std::tr1::shared_ptr<Texture> TexturePtr;
使用TexturePtr作為返回類型。 像這樣在generateTexture()中初始化它:
TexturePtr t(new Texture);
然后將所有方法訪問權限更改為->而不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.