使用 Devil 将纹理分段错误加载到 OpenGL 中

Segmentation fault loading texture with Devil into OpenGL

我正在尝试使用 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 全部包含并初始化

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

我猜你想改用 ilGetData()

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