我正在开发2D游戏项目,我想将openGl纹理包装在一个简单的类中。使用 libpng 从128x128px .png(带alpha通道)读取纹理。由于代码量非常大,我使用的是pastebin。
代码文件:
为了避免浪费你的时间,我会稍微解释一下代码:
纹理类:OpenGL纹理的包装器。 loadData
函数在gl中设置纹理(这是我怀疑不起作用的函数)。
OpenGl代码:debugSetTexture
函数将纹理放在temp
函数中使用的graphicsDraw()
变量中。这是因为它与main()
不在同一个源文件中。在graphicsMainLoop()
函数中,我使用实际调用Fork()
的{{1}}函数,并存储生成过程的fork()
。
从pid
开始,这就是我的工作:
main()
我尝试了一个名为gDEBugger的应用程序,在纹理查看器中,生成了一个纹理,但大小为0x0px。
我怀疑使用Texture :: loadTexture()加载纹理时会出现问题。
答案 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;而不是。