Я рисую из текстуры много белой череды. Но когда он рисует желтый круг, точки, которые содержат небольшое альфа-значение (но не равное 0), смешиваются неправильно, и я получаю некоторые более темные пиксели на экране (см. На снимке экрана, он был увеличен). В чем проблема? На синем фоне все в порядке.Неправильное смешивание в OpenGL при небольшом альфа-значении
ответ
Как @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.
Похож на интерполяционную проблему между белым пикселом с низким значением альфа и черным пикселем, который имеет альфа-значение 0 (внешняя сторона стрелки полностью прозрачная). – tkausl
Это может быть проблема с видеодрайвером? –
Нет, как работает интерполяция. Не уверен __how__ программа редактирования изображений сохраняет полностью прозрачные пиксели, но если я прав, она просто сохраняет их как черные, как это (обычно) не имеет значения. Это плохо. Вы должны предварительно обработать изображение перед его загрузкой и установить все пиксели с альфа-значением от 0 до белого. – tkausl