[英]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.