Возвращение результата функции stbi_load и использование его для glTexImage2D приводит к нарушению памяти

У меня проблема с библиотекой stbi, и я подумал, может быть, у вас есть идея, почему это не работает. Я объявил такую ​​функцию:

bool LoadTextureFile(std::string file, unsigned char ** pixel_data, int * width, int * height, int * n);

В этой функции я получаю результат stbi_load, сохраненный непосредственно в переменной * pixel_data:

*pixel_data = stbi_load(file.c_str(), width, height, n, 0);
// Do some more stuff till return
return true;

Итак, теперь мой указатель pixel_data указывает на память результата stbi_load. Теперь я хочу использовать этот результат с методом glTexImage2D в моей предыдущей функции. Эта функция вызывает метод LoadTextureFile перед вызовом метода glTexImage2D из OpenGL следующим образом:

bool LoadTexture(...)
{
int tex_width, tex_height, tex_n;
unsigned char * pixel_data    = NULL;
LoadTextureFile(filename, &pixel_data, &tex_width, &tex_height, &tex_n);
// Do something special ...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0, GL_RGB, GL_UNSIGNED_BYTE, &pixel_data);
stbi_image_free(&pixel_data);
// ...
}

Но если я делаю так, я получаю сообщение о нарушении памяти в момент вызова glTexImage2D.
Если я перенесу всю эту магию в LoadTextureFile, после загрузки нового файла текстуры с помощью stbi_load, он будет работать:

bool LoadTextureFile(std::string file, unsigned char ** pixel_data, int * width, int * height, int * n)
{
unsigned char * = = stbi_load(file.c_str(), width, height, n, 0);
// Do some magic ...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 80, 80, 0, GL_RGB, GL_UNSIGNED_BYTE, pixel_data);
stbi_image_free(pixel_data);
return true;
}

Может кто-нибудь сказать мне, почему я получаю это сообщение и как решить эту проблему?

Я полагаю, это вопрос безопасности зарезервированной памяти, но я не совсем уверен, как ее решить. Я пробовал это в простом консольном приложении раньше, и там это работает.

Спасибо за помощь!

1

Решение

Это:

unsigned char * pixel_data    = NULL;
[...]
glTexImage2D(..., &pixel_data);

это конечно не то, что вы хотите. Вы используете адрес Пионер к вашим данным пикселей, а не значение указателя, так что вы в основном говорите GL использовать некоторый случайный сегмент вашей памяти стека в качестве источника для текстуры. Должно быть просто

glTexImage2D(..., pixel_data);

В вашем втором варианте, что на самом деле происходит, неясно, так как линия

unsigned char * = = stbi_load(file.c_str(), width, height, n, 0);

просто не имеет смысла и никогда не скомпилируется. Поэтому я предполагаю, что это ошибка копирования и вставки при написании вопроса. Но трудно догадаться, что сделает ваш настоящий код.

1

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


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