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

C++ 将BMP加载到OpenGL纹理中会切换红色和蓝色。(C+;+;/Windows),c++,windows,opengl,bitmap,devil,C++,Windows,Opengl,Bitmap,Devil,我正在尝试将位图加载到OpenGL纹理并显示到屏幕上,但当我这样做时,红色和蓝色值似乎会切换(例如:蓝色图像显示为橙色,绿色图像保持不变,等等)。这个问题只存在于加载位图时,我可以加载.pngs相对无错误 这是我用来加载位图和设置纹理的代码。我使用的是DevIl,但我不确定这有多重要,因为当我使用不同的系统时存在问题(我不太记得是什么,它是window.h中的一个函数,我相信): iliit()和glEnable(GL\u TEXTURE\u 2D)都是在程序的前面调用的函数,以及其他不太相关的

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

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


iliit()
glEnable(GL\u TEXTURE\u 2D)
都是在程序的前面调用的函数,以及其他不太相关的函数。如果您能帮我找到问题的原因(并希望能够解决问题),我们将不胜感激。

不久前我也遇到过类似的问题。尝试将
glTexImage2D
中的
GL\u RBG
设置为
GL\u BGR

您通常会调用指定像素外部格式的glTexImage2D。从事物的声音来看,你需要检查它,然后从GL_RGB切换到GL_BGR。

你的RGB和BGR已经向后了

glTexImage2D(GL_TEXTURE_2D, 0, 3, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT), \
    0, GL_RGB, GL_UNSIGNED_BYTE, ilGetData());
您是否可以在第二行指定
GL\u BGR
,而不是
GL\u RGB
?这应该可以解决问题


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

您可以将
GL\u RGB
切换到
GL\u BGR\u EXT

在某些情况下,
GL_BGR
无法识别。

我知道这是一个老话题,但我发现最简单的方法是翻转vec4中的z和x,texture2D在片段着色器中返回,而不是glTexture2d。它不依赖于可能不存在的扩展。在我正在进行的一个GLE2项目中解决了这个问题

                "varying vec2 v_texCoord;                         "
                "uniform sampler2d s_texture;                     "
                "vec4 v_bgr;                                      "
                "void main()                                      "
                "{                                                "
                "    v_bgr = texture2D( s_texture, v_texCoord );  "
                "  gl_FragColor = v_bgr.zyxw;                     "
                "}                                                ";

谢谢我尝试了GL_BGR,但我得到一个错误,说它不存在。我也不明白为什么位图首先会与BGR数据一起存储,是吗?@Keand64:BMP文件,或者更准确地说,实际上是按BGR顺序存储的。实际上,在现代系统中,frambuffer位平面也是按BGR(A)顺序排列的,因此以BGR格式提供纹理通常比RGB格式更快。GL_BGR是OpenGL versions>1.1中的一个令牌,但是Windows平台SDK仅附带OpenGL-1.1的标题-任何超出此范围的内容都必须通过扩展访问。只需获取GLEW或GLee,使用其中的标题即可。您也可以尝试“#include”,但可能需要从中获取最新版本的glext.h
                "varying vec2 v_texCoord;                         "
                "uniform sampler2d s_texture;                     "
                "vec4 v_bgr;                                      "
                "void main()                                      "
                "{                                                "
                "    v_bgr = texture2D( s_texture, v_texCoord );  "
                "  gl_FragColor = v_bgr.zyxw;                     "
                "}                                                ";