Цветовое разделение текстур OpenGL

Я использую CImg в среде OpenGL. Когда я пытаюсь добавить текстуру, кажется, что каждый цвет разделяется на отдельные плитки внутри текстуры. Например, когда я пытаюсь использовать текстуру, которая выглядит следующим образом:

в моей программе это выглядит так:

Текстура, которую я загружаю, представляет собой файл 512×512 .bmp, сохраненный в Gimp с 24-битной глубиной цвета, RBG. Я пробовал некоторые другие форматы, которые позволяет Gimp, но они только вызывают ошибки с CImg.

Вот как я загружаю текстуру:

glBindTexture(GL_TEXTURE_2D, 13);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

CImg<unsigned char> src("MilkyWay.bmp");
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, src.width(), src.height(),
0, GL_RGB, GL_UNSIGNED_BYTE, src);

и вот как я отображаю текстуру:

glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, 13);
glBegin (GL_QUADS);
glTexCoord2f (0.0, 1.0);
glVertex3f (-120.0, 120.0, 0.0);
glTexCoord2f (1.0, 1.0);
glVertex3f (120.0, 120.0, 0.0);
glTexCoord2f (1.0, 0.0);
glVertex3f (120.0, -120.0, 0.0);
glTexCoord2f (0.0, 0.0);
glVertex3f (-120.0, -120.0, 0.0);
glEnd ();

3

Решение

CImg хранит каналы без чередования (или «планарные»), но GL ожидает обратного. Результатом является то, что вы видите.

Вы можете переупорядочить данные (или сделать так, чтобы CImg сделал это за вас), но поскольку каналы также имеют тенденцию к чередованию в исходном формате, библиотека изображений выполняет обратное чередование только для некоторого промежуточного шага, чтобы выполнить повторное чередование перед передачей в GL будет неэффективным. Вместо этого я бы порекомендовал использовать другой метод загрузки данных изображения, чтобы его можно было напрямую использовать.

Есть много библиотек, которые будут делать это, хотя BMP — довольно легкий формат для непосредственного чтения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector