【问题标题】:OpenGL 2d texture not workingOpenGL 2d 纹理不起作用
【发布时间】:2012-03-13 03:32:13
【问题描述】:

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

代码文件:

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

  • 纹理类: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() 加载纹理时发生的。

【问题讨论】:

  • 你为什么使用 Cygwin?而你是在 Cygwin 环境下运行程序吗?
  • “我怀疑 Texture::loadData() 函数不起作用”...您是否尝试在 Texture 类之外的最小示例中对相同数据执行完全相同的操作?这行得通吗?
  • @AndiDog 这是Eclipse的配置方式...我没有安装mingw,也不确定windows上是否存在libpng。
  • @Bart 我不确定我是否理解您要告诉我的内容。请澄清。
  • 那么第一件显而易见的事情就是尝试查看该文件是否存在于该路径下,或者它是否应该是“C:\Users\...”(或者为什么不使用相对路径?)。而且 libpng 应该可以与我假设的任何编译器一起编译,因为它是如此普遍。

标签: c++ opengl png 2d textures


【解决方案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 中失败了? (强烈提示)

您确实调用了 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);

然后将所有方法访问更改为通过 -> 而不是。

【讨论】:

  • 忘了说Error函数如果有错误输出到日志文件,仅此而已,不会出现错误。我还尝试在内存中生成图像(使用 memset),但它也不起作用。我现在正在尝试 glGetError。
  • 谢谢,这就是问题所在......调用了析构函数,这造成了麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2017-11-26
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多