我试图使用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全部包含并初始化
答案 0 :(得分:2)
我从未使用过DevIL,但是glTexImage2D
想要指向像素数据的指针作为最后一个参数,而是将指针传递给局部变量tex
,而是在堆栈上分配并且不包含预期信息。所以glTexImage2D
读取你的堆栈并最终尝试访问它不应该访问的内存并且你得到分段错误。
我猜你想要改用ilGetData()
。
答案 1 :(得分:0)
确保您使用ilInit ( )
初始化了DevIL并将&tex
更改为ilGetData ( )
然后它应该可以正常工作。