У меня проблема с библиотекой 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;
}
Может кто-нибудь сказать мне, почему я получаю это сообщение и как решить эту проблему?
Я полагаю, это вопрос безопасности зарезервированной памяти, но я не совсем уверен, как ее решить. Я пробовал это в простом консольном приложении раньше, и там это работает.
Спасибо за помощь!
Это:
unsigned char * pixel_data = NULL;
[...]
glTexImage2D(..., &pixel_data);
это конечно не то, что вы хотите. Вы используете адрес Пионер к вашим данным пикселей, а не значение указателя, так что вы в основном говорите GL использовать некоторый случайный сегмент вашей памяти стека в качестве источника для текстуры. Должно быть просто
glTexImage2D(..., pixel_data);
В вашем втором варианте, что на самом деле происходит, неясно, так как линия
unsigned char * = = stbi_load(file.c_str(), width, height, n, 0);
просто не имеет смысла и никогда не скомпилируется. Поэтому я предполагаю, что это ошибка копирования и вставки при написании вопроса. Но трудно догадаться, что сделает ваш настоящий код.