分割错误加载纹理与Devil进入OpenGL

时间:2015-02-20 23:54:15

标签: c++ opengl texture2d freeglut devil

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

2 个答案:

答案 0 :(得分:2)

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

我猜你想要改用ilGetData()

答案 1 :(得分:0)

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