Нарушение прав доступа при вызове glTextureParameteri с OpenGL и DevIL

Я пытаюсь загрузить изображение с DevIL, а затем создать текстуру. У меня есть класс с именем Textureи я делаю все это в конструкторе. Действительный контекст был создан. Я получаю нарушение прав доступа при первом вызове glTextureParameteri()так что я думаю, что текстура не была правильно привязана. Я просто не вижу причин, по которым это не связывало бы.

Вот конструктор:

Texture::Texture(const std::string& filename){
//DevIL handle for the image
unsigned int ilID;

ilGenImages(1, &ilID);

ilBindImage(ilID);

ilEnable(IL_ORIGIN_SET);
ilOriginFunc(IL_ORIGIN_LOWER_LEFT);

if (!ilLoad(IL_BMP, (ILstring)filename.c_str())){
DebugUtility::gl_log_err("Failed to load image &s\n", filename.c_str()); //Just function that prints to log file
return;
}
ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE);

glGenTextures(1, &texture);

//"texture" is global GLuint
glBindTexture(GL_TEXTURE_2D, texture);

//LINE BELOW CAUSES ACCESS VIOLATION!
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTextureParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTextureParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT),
0, GL_RGBA, GL_UNSIGNED_BYTE, ilGetData());

ilDeleteImages(1, &ilID);
//Again, prints to log file
DebugUtility::gl_log("Succefully loaded and created texture %s", filename.c_str());
}

ilLoad возвращает true, поскольку код внутри этого if-блока не выполняется. Вот ошибка (я использую Visual Studio 2013):

Необработанное исключение в 0x74E1CB49 в projectSDL.exe: 0xC0000005: нарушение прав доступа, местоположение выполнения 0x00000000.

2

Решение

Функция glTextureParameteri() это расширение, попробуйте использовать glTexParameteri() и привязка активного текстурного блока glActiveTexture(GL_TEXTURE0), glTextureParameteri() также ожидает идентификатор текстуры, а не цель.

4

Другие решения

glTextureParameter() это новая точка входа в OpenGL 4.5. Это часть семьи под названием «Прямой доступ к государству» (часто упоминается аббревиатурой DSA). Прежде чем перейти к основной функциональности в 4.5, это было определено в EXT_direct_state_access расширение.

Идея состоит в том, что вы можете изменять состояние объектов, не связывая их. Это может повысить эффективность за счет уменьшения количества вызовов API и накладных расходов драйвера.

Эти новые точки входа принимают имя объекта в качестве первого аргумента, по сравнению с соответствующими более старыми точками входа, которые принимают цель в качестве первого аргумента. В вашем случае вы должны использовать более старую точку входа:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

(Обратите внимание Tex вместо Texture), или передайте имя текстуры в качестве первого аргумента, без необходимости сначала связывать текстуру:

glTextureParameteri(texture, GL_TEXTURE_WRAP_S, GL_REPEAT);
[предупреждение, этот пункт основан на мнении и потенциально противоречивК сожалению, точки входа были определены таким образом, чтобы их было легко перепутать с предыдущими точками входа. Хотя OpenGL никогда не разрабатывался так, чтобы быть особенно дружественным к программисту, я предсказываю, что гораздо больше людей будут сбиты с толку этими новыми точками входа, которые имеют очень похожие имена, как существующие, и с такими же сигнатурами. Похоже, очень неудачный дизайн API для меня.

2

По вопросам рекламы [email protected]