stb图像加载库返回白色纹理
stb image loading library returning white textures
我正在尝试将纹理加载到我的小型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个值,你可能还有其他错误。确保文件名的路径正确,并确保启用了纹理。
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- OpenGL 混合会在纹理周围创建白色边框
- 在 SFML 中不使用动态内存时显示白色纹理代替实际纹理
- OpenGL GLSL 纹理函数始终返回 vec4(1,1,1,1),白色三角形
- 现代OpenGL,在对象上获得白色纹理
- 为什么 SFML 加载的是白色方块而不是纹理
- SFML中的白色方块,角色和纹理存储在不同的对象中
- 纹理在 opengl 中显示为白色
- stb图像加载库返回白色纹理
- 在OpenGL中绘制完全白色纹理
- OpenGL显示白色纹理
- SFML中的白色正方形,但纹理加载良好