Загрузка BMP в текстуры OpenGL переключает красный и синий цвета.(C ++ / Windows) - PullRequest
7 голосов
/ 26 февраля 2011

Я пытаюсь загрузить растровое изображение в текстуру OpenGL и отобразить его на экране, но когда я это делаю, значения красного и синего, кажется, меняются (например, синее изображение отображается оранжевым, зеленые изображения остаются неизменнымитак далее..).Эта проблема существует только при загрузке растровых изображений, я могу загрузить .pngs относительно без ошибок.

Это код, который я использую для загрузки растровых изображений и установки текстур.Я использую 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) оба вызываются ранее в программе, среди других менее значимых функций.Любая помощь в поиске причины (и, мы надеемся, исправлении) проблемы будет принята с благодарностью.

Ответы [ 5 ]

10 голосов
/ 26 февраля 2011

У вас есть 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 хранятся снизу вверх, первые пиксели в файле - это нижняя строка изображения.

2 голосов
/ 23 марта 2014

Вы можете переключить GL_RGB на GL_BGR_EXT. В некоторых случаях GL_BGR не распознается.

1 голос
/ 26 февраля 2011

У меня была похожая проблема некоторое время назад.Попробуйте установить GL_RBG в glTexImage2D на GL_BGR.

0 голосов
/ 30 января 2016

Я знаю, что это старая тема, но я обнаружил, что проще всего было перевернуть z и x в vec4, который 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;                     "
                "}                                                ";
0 голосов
/ 26 февраля 2011

Обычно у вас будет вызов glTexImage2D, который определяет внешний формат пикселей.Судя по звукам вещей, вы должны это проверить и переключиться с GL_RGB на GL_BGR.

...