Я пытаюсь загрузить текстуру в OpenGL с помощью Devil, и у меня возникает ошибка сегментации при вызове этого конструктора
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;
Как только этот конструктор вызывается, я получаю ошибку segfault, и она завершается, и я использую freeglut, gl, il, ilu и ilut. любая помощь будет оценена
Редактировать:
Я также решил использовать другой подход и использовать
texture = ilutGLLoadImage(path)
Функция просто загрузить его непосредственно в текстуру GL, потому что я нашел Segfault из
ilLoadImage(path)
но компилятор говорит мне, что ilutGLLoadImage () не объявлен в этой области, и у меня есть IL / il.h IL / ilu.h и IL / ilut.h все включены и инициализированы
Я никогда не использовал DevIL, но glTexImage2D
требуется указатель на данные пикселя в качестве последнего аргумента, и вы передаете указатель на локальную переменную tex
вместо этого, который расположен в стеке и не содержит ожидаемой информации. Так glTexImage2D
читает ваш стек и в конечном итоге пытается получить доступ к памяти, к которой он не должен был получить доступ, и вы получаете ошибку сегментации.
Я думаю, вы хотели бы использовать ilGetData()
вместо.
Убедитесь, что DevIL инициализирован с ilInit ( )
и изменить &tex
в ilGetData ( )
и тогда это должно работать.