stb图像加载库返回白色纹理

stb image loading library returning white textures

本文关键字:白色 纹理 返回 图像 加载 stb      更新时间:2023-10-16

我正在尝试将纹理加载到我的小型OpenGL应用程序中。我看过很多关于stb图书馆的推荐信。它真的很适合我的需求,因为它不需要构建或链接,我只需要包含标题。

不幸的是,我似乎无法让它正确加载纹理(在我的Linux笔记本电脑或Windows桌面上)。它正确地找到了文件(因为尺寸适合我当时测试的任何纹理),但它没有正确地加载像素。

我最初以为这是我在OpenGL代码中犯的错误,但在进一步检查返回给我的数组stb时,我发现无论我试图加载什么图像,它都会填充255作为每个值。

这是我的纹理加载代码:

bool Texture::LoadTextureFromFile(std::string path)
{
  bool success = true;
  int comp, width, height;
  unsigned char* image = stbi_load(path.c_str(), &width,
      &height, &comp, 0);
  texture_width = width;
  texture_height = height;
  glGenTextures(1, &texture_id);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,
      GL_UNSIGNED_BYTE, image);
  glBindTexture(GL_TEXTURE_2D, 0);
  stbi_image_free(image);
  return success;
}

一个星期以来,我一直在思考这个问题,我真的很想在这个问题上得到一些启示。

如果有人认为这会有所帮助,我也可以展示我的OpenGL初始化代码。

您的opengl代码中确实存在错误。必须在glGenTextures(1, &texture_id)之后绑定纹理。我通过添加它使您的代码正常工作(我还将RGB更改为RGBA,因为我使用的图像文件是RGBA格式)。

bool load(std::string filename) {
  int w, h, comp; 
  GLuint t; 
  unsigned char * im = stbi_load(filename.c_str(), &w, &h, &comp, 0);
  glGenTextures(1, &t); 
  glBindTexture(GL_TEXTURE_2D, t);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, im); 
  glBindTexture(GL_TEXTURE_2D, 0);
  return true;
}

这段代码对我有效。如果你说你从stbi_load中只得到255个值,你可能还有其他错误。确保文件名的路径正确,并确保启用了纹理。