簡體   English   中英

OpenGL 2d紋理不起作用

[英]OpenGL 2d texture not working

我正在研究2D游戲項目,我想將openGl紋理包裝在一個簡單的類中。 使用libpng從128x128px .p​​ng(具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM