【问题标题】:Segmentation fault loading texture with Devil into OpenGL使用Devil将纹理加载到OpenGL中的分段错误
【发布时间】:2015-04-22 19:07:02
【问题描述】:

我正在尝试使用 Devil 将纹理加载到 OpenGL 中,并且在调用此构造函数时出现分段错误

Sprite::Sprite(const char *path){

    ILuint tex = 0;

    ilutEnable(ILUT_OPENGL_CONV);
    ilGenImages(1, &tex);
    ilBindImage(tex);
    ilLoadImage(path);
    ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);
    width  = (GLuint*)ilGetInteger(IL_IMAGE_WIDTH);
    height = (GLuint*)ilGetInteger(IL_IMAGE_HEIGHT);

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexImage2D(GL_TEXTURE_2D,
                 0,
                 GL_RGBA,
                 width,
                 height,
                 0,
                 GL_RGBA,
                 GL_UNSIGNED_BYTE,
                 &tex);

    ilBindImage(0);
    ilDeleteImages(1, &tex);
    ilutDisable(ILUT_OPENGL_CONV);

}

并且纹理是受保护的成员

GLuint texture;

只要调用此构造函数,我就会收到一个段错误并退出,我正在使用 freeglut、gl、il、ilu 和 ilut。任何帮助将不胜感激

编辑:

我也决定采取不同的方法并使用

texture = ilutGLLoadImage(path)

函数将其直接加载到 gl 纹理中,因为我找到了来自

的段错误
ilLoadImage(path)

但是编译器告诉我 ilutGLLoadImage() 没有在这个范围内声明,我有 IL/il.h IL/ilu.h 和 IL/ilut.h 都包含并初始化了

【问题讨论】:

  • 另外我对opengl还很陌生,这是我第一次尝试任何图像加载或纹理,所以我可能使用了一些非常错误的功能

标签: c++ opengl texture2d freeglut devil


【解决方案1】:

我从未使用过 DevIL,但 glTexImage2D 想要指向像素数据的指针作为最后一个参数,而您将指针传递给那里的局部变量 tex,它在堆栈上分配并且不包含预期的信息。所以glTexImage2D 会读取你的堆栈并最终尝试访问它不应该访问的内存,你会遇到分段错误。

我猜你想改用ilGetData()

【讨论】:

  • 我试过了,我仍然得到一个段错误,你说的有道理,但不会 ilGetData() 引用与 &tex 相同的内存?
  • tex 的类型为ILuint 并在堆栈上分配,因此它占用固定数量的内存(并且可能只是usigned int 的typedef),您不可能将任意大小的图像加载到它。所以它很可能只是一个类似于您通过调用glGenTextures 获得的描述符。运行带有调试器的程序,您将能够找出确切的崩溃位置。
  • 正如您在上面的编辑中看到的那样,我能够找到它,但这只是通过一次注释一行并运行程序来查找它何时不会崩溃,如何我可以让 gdb 输入该函数而不仅仅是 main 吗?当我使用它时,它只调试 main
  • 您的代码缺少错误检查。你确定图片加载正常吗?
  • 无效加载会导致分段错误吗?我原以为内存仍然会像空指针一样分配
【解决方案2】:

确保您已使用 ilInit ( ) 初始化 DevIL 并将 &tex 更改为 ilGetData ( ) 然后它应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2011-02-09
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多