将BMP加载到OpenGL纹理切换红色和蓝色的颜色。 (C ++ /视窗)

我试图加载一个OpenGL纹理的位图并将其显示到屏幕上,但是当我这样做时,红色和蓝色值似乎切换(例如:蓝色图像显示为橙色,绿色图像保持不变等。 )。 这个问题只存在加载位图时,我可以加载.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)都被调用,其他不太相关的函数也被调用。 任何帮助find原因(并希望解决)的问题将不胜感激。

你有你的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存储在底部,文件中的第一个像素是图像的底部行。

您可以将GL_RGB切换到GL_BGR_EXT 。 在某些情况下, GL_BGR不被识别。

我有一个类似的问题。 尝试将glTexImage2D中的GL_BGR设置为GL_BGR

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

我知道这是一个老话题,但我发现最简单的方法是翻转vec4中的z和x,texture2D在片段着色器中返回,而不是glTexture2d。 它不依赖于可能不存在的扩展。 解决它在一个GLES 2项目即时通讯工作。

  "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; " "} ";