Изменение цвета в OpenGL

#opengl #colors #2d #alpha #alphablending

#opengl #Цвет #2d #альфа #добавление букв

Вопрос:

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

 glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);

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

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

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

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

введите описание изображения здесь

Комментарии:

1. Возможно, что-то не очищается должным образом…

Ответ №1:

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

 glBlendFunc(GL_SRC_ONE,GL_ONE_MINUS_SRC_ALPHA);
  

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

Причиной было предварительно умноженное альфа-значение в PNG. Альфа-версию необходимо было отделить от RGB, чтобы исправить изображение и удалить артефакт серого (подробности см. в цепочке комментариев)

Комментарии:

1. Использование GL_ONE привело к тому, что одни и те же пятна стали сверхяркими, а не обесцвеченными.

2. GL_DECAL или GL_REPLACE (если первое, попробуйте второе)

3. GL_REPLACE, казалось, не имел никакого эффекта; GL_DECAL вызвал белый фон на всех квадратиках (это с моей оригинальной функцией blend. С новым, те же результаты, только все очень яркое).

4. Я думаю, что ваш исходный PNG (тот, что с прозрачностью), возможно, имел предварительно увеличенный альфа-формат, в результате чего области, отличающиеся от oqaque, были слишком темными. Вы должны быть в состоянии исправить это, настроив каналы RGB (разделив на их альфа-значение), чтобы восстановить их, поэтому посмотрите, есть ли возможность сохранить их без предварительного умножения.

5. ВАУ! Да, я думаю, вы правы насчет того, что это предварительно умноженная альфа-проблема. Я все еще не уверен точно, что не так, но после вашего комментария об исправлении этого, я поэкспериментировал и добавил эту строку в мой фрагментный шейдер: texColor = vec4(texColor.rgb / sqrt(texColor.a), texColor.a); . Теперь все выглядит великолепно! Может быть, поместить предварительно умноженную альфа-версию в основной пост для дальнейшего использования?

Ответ №2:

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

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

Комментарии:

1. Я попытался добавить glColor3ub (255,255,255) непосредственно перед тем, как был нарисован мой четырехугольник. Никакого эффекта.

Ответ №3:

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

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  

и

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  

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

Комментарии:

1. Чтобы завершить эксперимент, можете ли вы также попробовать установить для GL_TEXTURE_MAG_FILTER значение GL_NEAREST? У меня возникли небольшие проблемы с определением того, что показано на вашем скриншоте, вы говорите, что рисуете в 2D, но это почти похоже на 3D сцену (возможно, мои глаза обманывают меня). Можете ли вы опубликовать более четкое изображение того, что именно вы визуализируете?

2. Пробовал, ничего не вышло. Предполагается, что это выглядит как 3D-сцена, но она сделана из предварительно отрисованных 2D-фрагментов. То, на что вы смотрите, — это просто два квадрата, расположенных непосредственно друг над другом, один из которых содержит колонну и сливается с другим (где находится серое пятно). В принципе, около 0% верхней плитки alpha, я в порядке, и около 100% я в порядке, но около 50% похоже, что верхняя плитка каким-то образом приглушает цвет нижней плитки (или свой собственный?)

3. Не могли бы вы где-нибудь опубликовать оригинальные текстуры?

4. Просто добавил их к вопросу. 🙂

5. Так не является ли серое пятно просто областью градиента верхней текстуры, смешивающейся с серой / коричневой текстурой пола за ней?