繁体   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