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

MANiC

我在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;
}

有人可以告诉我为什么收到此消息以及如何解决此问题吗?

我想这是确保保留的内存安全的问题,但是我不确定如何解决它。我之前曾在一个简单的控制台应用程序中尝试过此方法,并且该方法可以正常工作。

谢谢您的帮助!

这:

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

当然不是您想要的。您使用的是像素数据的先导者地址,而不是指针,因此,您基本上是在告诉GL使用堆栈存储器的某个随机段作为纹理的源。应该只是

glTexImage2D(..., pixel_data);

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

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

只是没有意义,而且永远不会编译。因此,我认为在编写问题时这是复制和粘贴错误。但是很难猜测您的实际代码会做什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章