gpt4 book ai didi

c++ - 返回 stbi_load 函数的结果并将其用于 glTexImage2D 会导致内存冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:33 26 4
gpt4 key购买 nike

我对 stbi 库有疑问,我想,也许你知道为什么它不起作用。我已经声明了这样一个函数:

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

在这个函数中我得到了直接保存在*pixel_data变量中的stbi_load的结果:

*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;
}

谁能告诉我为什么会收到这条消息以及如何解决这个问题?

我想,这是保持保留内存安全的问题,但我不太确定如何解决它。我之前在一个简单的控制台应用程序中试过这个,它在那里工作。

感谢您的帮助!

最佳答案

这个:

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

肯定不是你想要的。您正在使用 pionter 的地址作为您的像素数据,而不是指针的,所以您基本上是在告诉 GL 使用堆栈内存的一些随机段作为纹理的来源。应该只是

glTexImage2D(..., pixel_data);

在您的第二个变体中,实际发生的情况尚不清楚,因为该行

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

只是没有意义,永远不会编译。所以我假设这是写问题时的复制和粘贴错误。但是很难猜测您的真实代码会做什么。

关于c++ - 返回 stbi_load 函数的结果并将其用于 glTexImage2D 会导致内存冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23843728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com