我对 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 方法一起使用。该函数在调用 OpenGL 的 glTexImage2D 方法之前调用 LoadTextureFile 方法,如下所示:
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 时收到内存违规消息。如果我在使用 stbi_load 加载一个新的纹理文件后将整个魔法移动到 LoadTextureFile 中,那么它可以工作:
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;
}
有人可以告诉我为什么会收到此消息以及如何解决此问题吗?
我想,这是保持保留内存安全的问题,但我不太确定如何解决它。我之前在一个简单的控制台应用程序中尝试过这个,它在那里工作。
谢谢您的帮助!