Изменение цвета в OpenGL - PullRequest
7 голосов
/ 06 июня 2011

Я использую OpenGL для рисования в 2D. Я пытаюсь наложить текстуры с альфа. Я сделал это:

glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

А потом я рисую в обратном z-порядке. Тем не менее, я получаю странные изменения цвета. Вот пример чего-то, что должно плавно переходить от одного изображения к другому (на самом деле, изображения в этом конкретном случае являются бесшовными, но это не всегда происходит (поэтому нет, я не могу просто не иметь альфа)): Strange discoloration from alpha blending

Видите серое пятно посередине? Этот патч отсутствует ни в одном из исходных PNG. Кто-нибудь знает, что вызывает это и как это исправить? Возможно, совершенно другая альфа-стратегия?

РЕДАКТИРОВАТЬ: Для справки, вот две текстуры смешиваются:

enter image description here

Ответы [ 3 ]

2 голосов
/ 10 июня 2011

Есть ли какие-либо изменения, если вы используете это в качестве функции смешивания?

glBlendFunc(GL_SRC_ONE,GL_ONE_MINUS_SRC_ALPHA);

РЕДАКТИРОВАНИЕ / РЕШЕНИЕ:

Преумноженная альфа в PNG была виновником.Для исправления изображения и удаления серого артефакта необходимо было разделить альфа-канал из RGB на части (см. Цепочку комментариев)

0 голосов
/ 07 июня 2011

Я сейчас дико догадываюсь здесь, но если Z-бой и цветовая модуляция исключены, это может быть какой-то артефакт фильтрации. Для быстрого теста переключения между

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

и

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

если эффект меняется между вами, некоторая фильтрация каким-то образом портит вашу окраску. Решение. Используйте mipmapping и создайте уровни mipmap с помощью метода понижающей дискретизации, который сохраняет нужные функции. Стандарт gluBuildMipmaps использует довольно тупой фильтр, поэтому не используйте его.

0 голосов
/ 07 июня 2011

Если ваш GL_TEXTURE_ENV является значением по умолчанию GL_MODULATE, у вас может быть какое-то старое цветовое состояние.

Попробуйте сбросить его с помощью glColor3ub(255,255,255) перед рендерингом вашей текстурированной геометрии.

...