c++ - OpenGL 纹理格式的颜色错误

标签 c++ opengl

我正在尝试使用 FreeImage 加载图像,然后生成 OpenGL 纹理。它加载图像并生成纹理,但颜色存在问题。

原图如下: original

结果如下: result

纹理加载代码:

void TextureManager::LoadTexture(std::string id, std::string filePath){

Texture tex;
tex.TextureId = 0;

FIBITMAP* image = FreeImage_Load(FreeImage_GetFileType(filePath.c_str(), 0), filePath.c_str());


if (FreeImage_GetBPP(image) != 32) {

    image = FreeImage_ConvertTo32Bits(image);
}


FreeImage_FlipVertical(image);

tex.Width = FreeImage_GetWidth(image);
tex.Height = FreeImage_GetHeight(image);


glGenTextures(1, &tex.TextureId);
glBindTexture(GL_TEXTURE_2D, tex.TextureId);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,tex.Width, tex.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(image));

AddTextureToMap(id, tex);

FreeImage_Unload(image);
}

这是绘制它的代码:

glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D, TextureManager.TextureMap[textureSelector].TextureId);

glBegin(GL_TRIANGLES);
glTexCoord2d(0, 0);
glVertex3f(-0.75, 0.75, 0);//top left
glTexCoord2d(1, 0);
glVertex3f(0.75, 0.75, 0);//top right
glTexCoord2d(0, 1);
glVertex3f(-0.75, -0.75, 0);//bottom left

glTexCoord2d(1, 0);
glVertex3f(0.75, 0.75, 0);//top right
glTexCoord2d(1, 1);
glVertex3f(0.75, -0.75, 0);//bottom right
glTexCoord2d(0, 1);
glVertex3f(-0.75, -0.75, 0);//bottom left
glEnd();
glFinish();

我很确定这是 glTexImage2D 中的内部格式问题,但我不确定如果是这种情况我会使用哪种格式。我的问题是:是格式吗,如果是,我应该用什么;还是有其他问题导致了这种情况?

最佳答案

尝试改用它

区别是因为许 multimap 像格式使用反向字节顺序,你应该使用 GL_BGR_EXT 或 GL_BGRA_EXT 图像格式而不是 GL_RGB 或 GL_RGBA

void TextureManager::LoadTexture(std::string id, std::string filePath){

Texture tex;
tex.TextureId = 0;

FIBITMAP* image = FreeImage_Load(FreeImage_GetFileType(filePath.c_str(), 0), filePath.c_str());


if (FreeImage_GetBPP(image) != 32) {

    image = FreeImage_ConvertTo32Bits(image);
}


FreeImage_FlipVertical(image);

tex.Width = FreeImage_GetWidth(image);
tex.Height = FreeImage_GetHeight(image);


glGenTextures(1, &tex.TextureId);
glBindTexture(GL_TEXTURE_2D, tex.TextureId);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,tex.Width, tex.Height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(image));

AddTextureToMap(id, tex);

FreeImage_Unload(image);
}

关于c++ - OpenGL 纹理格式的颜色错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33113010/

相关文章:

go - OBJ 渲染不正确的纹理坐标

c++ - 当相应字符不在同一位置时字符串的所有排列

java - 相机应平滑地跟随特定点

opengl - 为什么glGenerateMipmap(GL_TEXTURE_2D)和设置GL_TEXTURE_MIN_FILTER为GL_LINEAR可以解决黑色纹理问题?

java - 事件多次触发 - LWJGL

Qt开发以及OpenGL与QML页面的必要性

c++ - 在 C++ 中使用私有(private)方法的属性

c++ - 压缩后将哈夫曼树写入文件

c++ - boost 库中 float 和 double 的类型定义

c++ - 使用 unordered_map,其中 Key 是 T 的成员