c++ - 将 BMP 加载到 OpenGL 纹理中会切换红色和蓝色。 (C++/Windows )

标签 c++ windows opengl bitmap devil

我正在尝试将位图加载到 OpenGL 纹理中并将其显示到屏幕上,但是当我这样做时,红色和蓝色值似乎会切换(例如:蓝色图像显示为橙色,绿色图像保持不变, ETC..)。此问题仅在加载位图时存在,我可以相对无错误地加载 .png。

这是我用来加载位图和设置纹理的代码。我正在使用 DevIl,但我不确定这有多相关,因为当我使用不同的系统时存在问题(我不太记得是什么,我相信它是 window.h 中的一个函数):

ilOriginFunc(IL_ORIGIN_LOWER_LEFT);
ilEnable(IL_ORIGIN_SET);
ILuint image;
ilGenImages(1, &image);
ilBindImage(image);
ilLoad(IL_BMP, "Data/NeHe.bmp"); // Incidentally, loading a png, although it fixes the problem,
                                 // rotates the image 180 degrees.  Not sure if that's important or not,
                                 // But it's why I added the first line of code

glGenTextures(3, &_texture[0]);
glBindTexture(GL_TEXTURE_2D, _texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), \
    0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData());

ilInit()glEnable(GL_TEXTURE_2D) 都在程序的较早部分被调用,还有其他不太相关的函数。如果您能帮助找到问题的原因(并希望解决),我们将不胜感激。

最佳答案

您的 RGB 和 BGR 反了。

glTexImage2D(GL_TEXTURE_2D, 0, 3, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), \
    0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData());

是否可以在第二行指定 GL_BGR 而不是 GL_RGB?这应该可以解决问题。

PNG 导致图像翻转的原因是 BMP 的存储方式:BMP 是自下而上存储的,文件中的第一个像素是图像的底行。

关于c++ - 将 BMP 加载到 OpenGL 纹理中会切换红色和蓝色。 (C++/Windows ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5123387/

相关文章:

c++ - 如何检查模板参数是否为 2 的幂?

c++ - 如何在 C++ (Unicode) 中将 std::string 转换为 LPCWSTR

windows - Microsoft.Phone.WinJS.2.1 在哪里下载?

c++ - 在 Windows C++ 应用程序中获取主线程的控制

c++ - 如何使用glsl改变顶点位置

c++ - 在 visual studio 2010 和 c++ 中使用 OpenGL 绘制带有箭头的轴

c++ - CreateProcess 忽略 lpCurrentDirectory/父工作目录

C++0x : overloading on lambda arity

windows - Windows 应用程序如何使用多个进程?

opengl - 重用顶点属性缓冲区作为索引缓冲区?