C++ OpenGL 2d纹理不工作
我正在做一个2D游戏项目,我想把openGl纹理封装在一个简单的类中。使用libpng从128x128px.png(带有alpha通道)读取纹理。由于代码量相当大,我使用的是pastebin 代码文件:C++ OpenGL 2d纹理不工作,c++,opengl,png,2d,textures,C++,Opengl,Png,2d,Textures,我正在做一个2D游戏项目,我想把openGl纹理封装在一个简单的类中。使用libpng从128x128px.png(带有alpha通道)读取纹理。由于代码量相当大,我使用的是pastebin 代码文件: 纹理类别: PngReader类:(似乎工作正常,所以我删除了描述) OpenGl代码: 为了避免浪费您的时间,我将稍微解释一下代码: 纹理类:OpenGL纹理的包装器。loadData函数在gl中设置纹理(我怀疑这个函数不起作用) OpenGl代码:debugsetxture函数将纹理放
- 纹理类别:
- PngReader类:(似乎工作正常,所以我删除了描述)
- OpenGl代码:
- 纹理类:OpenGL纹理的包装器。
函数在gl中设置纹理(我怀疑这个函数不起作用)loadData
- OpenGl代码:
函数将纹理放入debugsetxture
变量中,该变量用于temp
函数。这是因为它与graphicsDraw()
不在同一个源文件中。在main()
函数中,我使用graphicsmailoop()
函数,它实际上调用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;
}
假设加载png文件成功,假设程序在glBindTexture中失败?(强烈暗示)
您确实调用了错误函数来处理文件,但您的程序是停止还是继续运行
这里有一个严重的问题:Texture PngReader::generateTexture()按值返回纹理。这将导致在返回时复制纹理对象(handle和all),然后调用~Texture(),从而破坏基于堆栈的副本。因此,您的程序将调用glDeleteTextures几次
如果您想按值返回它,可以将其包装在一个共享的\u ptr中,该ptr进行引用计数。这将导致析构函数只被调用一次:
#include <tr1/memory>
typedef std::tr1::shared_ptr<Texture> TexturePtr;
然后将所有方法访问更改为通过->而不是。为什么要使用Cygwin?您是否在Cygwin环境中运行该程序?“我怀疑Texture::loadData()函数不起作用”。。。那么,您是否尝试在纹理类之外的最小示例中对相同的数据执行完全相同的操作?这行吗?@AndiDog这是Eclipse的配置方式。。。我没有安装mingw,我不确定windows上是否存在libpng。@Bart我不确定我是否理解你想告诉我的内容。请澄清。那么第一件显而易见的事情就是尝试看看文件是否存在于该路径下,或者它是否应该是“C:\Users\…”(或者为什么不使用相对路径?)。我认为libpng应该可以用任何编译器编译,因为它太普遍了。忘了提到如果有任何错误,Error函数会输出到日志文件,仅此而已,并且不会出现错误。我还尝试在内存中生成一个图像(使用memset),但它也不起作用。我正在尝试glGetError。谢谢,这就是问题所在。。。调用了析构函数,这造成了麻烦。
#include <tr1/memory>
typedef std::tr1::shared_ptr<Texture> TexturePtr;
TexturePtr t(new Texture);