0

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

4

2 回答 2

2

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

我想你会想ilGetData()改用。

于 2015-02-21T00:47:31.397 回答
0

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

于 2015-06-17T09:40:16.100 回答