【问题标题】:Loading a BMP into an OpenGL textures switches the red and blue colors. (C++/Windows)将 BMP 加载到 OpenGL 纹理中会切换红色和蓝色。 (C++/Windows)
【发布时间】:2011-07-04 15:34:42
【问题描述】:

我正在尝试将位图加载到 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) 都在程序的早期调用,以及其他不太相关的函数。任何帮助找到问题的原因(并希望解决)将不胜感激。

【问题讨论】:

    标签: c++ windows opengl bitmap devil


    【解决方案1】:

    您的 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_BGR,但我收到一条错误消息,说它不存在。我也不明白为什么首先将位图与 BGR 数据一起存储,是吗?
    • @Keand64:BMP 文件,或者准确地说,实际上是以 BGR 顺序存储的。实际上,在现代系统上,帧缓冲区位平面也是 BGR(A) 顺序的,因此以 BGR 格式提供纹理通常比 RGB 格式更快。 GL_BGR 是来自 OpenGL 版本 >1.1 的令牌,但是 Windows 平台 SDK 仅附带 OpenGL-1.1 的标头 - 任何超出的内容都必须通过扩展访问。只需获取 GLEW glew.sourceforge.net 或 GLee,使用这些标题即可完成。
    • 您也可以尝试“#include ”,但可能需要从opengl.org/registry/api/glext.h获取最新版本的 glext.h
    【解决方案2】:

    您可以将GL_RGB 切换为GL_BGR_EXT。 在某些情况下,GL_BGR 无法识别。

    【讨论】:

      【解决方案3】:

      不久前我遇到了类似的问题。尝试将glTexImage2D 中的GL_RBG 设置为GL_BGR

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我知道这是一个老话题,但我发现最简单的方法是翻转 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;                     "
                          "}                                                ";
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-27
            • 1970-01-01
            • 2014-08-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-21
            相关资源
            最近更新 更多