2016-08-27 11 views
1

Я рисую из текстуры много белой череды. Но когда он рисует желтый круг, точки, которые содержат небольшое альфа-значение (но не равное 0), смешиваются неправильно, и я получаю некоторые более темные пиксели на экране (см. На снимке экрана, он был увеличен). В чем проблема? На синем фоне все в порядке.Неправильное смешивание в OpenGL при небольшом альфа-значении

screenshot

+0

Похож на интерполяционную проблему между белым пикселом с низким значением альфа и черным пикселем, который имеет альфа-значение 0 (внешняя сторона стрелки полностью прозрачная). – tkausl

+0

Это может быть проблема с видеодрайвером? –

+0

Нет, как работает интерполяция. Не уверен __how__ программа редактирования изображений сохраняет полностью прозрачные пиксели, но если я прав, она просто сохраняет их как черные, как это (обычно) не имеет значения. Это плохо. Вы должны предварительно обработать изображение перед его загрузкой и установить все пиксели с альфа-значением от 0 до белого. – tkausl

ответ

1

Как @tklausi отметил в комментариях, эта проблема была связана с текстурой интерполяции в сочетании с традиционной полупрозрачностью. При переходе от значений с высокой альфа к «фону» с альфа = 0 вы получите некоторые результаты интерполяции, где alpha> 0, а RGB смешан с вашим «фоновым» цветом.

Решение tlkausi должно было изменить значения RGB фона на белый. Но это приведет к той же проблеме, что и раньше: если ваше фактическое изображение имеет темные цвета, тогда вы увидите яркие артефакты.

Правильным решением будет повторение цвета RGB фактических пограничных пикселей, так что интерполяция всегда будет иметь один и тот же цвет, только с более низким значением альфа.

Однако существует гораздо лучшее решение: преумноженный альфа. Вместо сохранения (R, G, B, a) в текстуре на пиксель вы сохраняете (aR, aG, aB, a). При смешивании вы не используете a*source + (1-a) * background, но только source + (1-a)*background. Разница в том, что теперь у вас есть «нейтральный элемент» (0,0,0,0), и интерполяция к этому не вызовет никаких проблем. Он хорошо работает с фильтрацией, а также хорош для mipmapping и других методов.

В общем, я бы порекомендовал всегда использовать предварительно умноженное альфа в пользу «традиционного». Премультипликация может быть непосредственно применена к файлу изображения, или вы можете сделать это при загрузке текстуры, но это вообще не требует затрат времени исполнения.

Дополнительную информацию о премультиплексной альфа можно найти in this MSDN blog article или over here at NVIDIA.

 Смежные вопросы

  • Нет связанных вопросов^_^