我试图加载一个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; " "} ";