我对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时会收到内存冲突消息。 如果我将整个魔法移动到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;
}
有人可以告诉我为什么会收到此消息以及如何解决此问题?
我想,这是保持内存安全的问题,但我不确定,如何解决它。我之前在一个简单的控制台应用程序中尝试过它,并且它可以工作。
感谢您的帮助!
答案 0 :(得分:1)
此:
unsigned char * pixel_data = NULL;
[...]
glTexImage2D(..., &pixel_data);
肯定不是你想要的。您正在使用pionter的地址来处理像素数据,而不是指针的值,因此您基本上告诉GL使用堆栈内存的某些随机段作为纹理的来源。它应该只是
glTexImage2D(..., pixel_data);
在你的第二个变体中,实际发生的事情是不清楚的
unsigned char * = = stbi_load(file.c_str(), width, height, n, 0);
只是没有意义,永远不会编译。所以我认为在编写问题时它是复制和粘贴错误。但很难猜出你的真实代码会做什么。