OpenGL 2d纹理不起作用

时间:2012-02-22 18:45:10

标签: c++ opengl png 2d textures

我正在开发2D游戏项目,我想将openGl纹理包装在一个简单的类中。使用 libpng 从128x128px .p​​ng(带alpha通道)读取纹理。由于代码量非常大,我使用的是pastebin。

代码文件:

为了避免浪费你的时间,我会稍微解释一下代码:

  • 纹理类:OpenGL纹理的包装器。 loadData函数在gl中设置纹理(这是我怀疑不起作用的函数)。

  • OpenGl代码debugSetTexture函数将纹理放在temp函数中使用的graphicsDraw()变量中。这是因为它与main()不在同一个源文件中。在graphicsMainLoop()函数中,我使用实际调用Fork()的{​​{1}}函数,并存储生成过程的fork()

pid开始,这就是我的工作:

main()

我尝试了一个名为gDEBugger的应用程序,在纹理查看器中,生成了一个纹理,但大小为0x0px。

我怀疑使用Texture :: loadTexture()加载纹理时会出现问题。

1 个答案:

答案 0 :(得分: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对象在返回(句柄和所有)时被复制,然后~With()被调用,从而破坏基于堆栈的副本。所以你的程序会调用glDeleteTextures几次!

如果要按值返回,可以将其包装在shared_ptr&lt;&gt;中。哪个引用计数。这将导致析构函数只被调用一次:

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

使用TexturePtr作为返回类型。在generateTexture()中初始化它,如下所示:

TexturePtr t(new Texture);

然后更改所有方法访问权限 - >&gt;而不是。