Какова формула для альфа-смешивания для нескольких пикселей?

У меня есть несколько пикселей RGBA, каждый из которых имеет Альфа-компонент.

Итак, у меня есть список пикселей: (p0 p1 p2 p3 p4 ... pn), где p_0_-передний пиксель, а p_n_-самый дальний (сзади).

последний (или любой) пиксель не является непрозрачным, поэтому полученный смешанный пиксель также может быть прозрачным. Я смешиваюсь с начала списка до конца, а не наоборот (Да, это raytracing). Так что если результат в любой момент становится достаточно непрозрачным, я могу остановиться с достаточно правильным результатом. Я применю алгоритм смешивания следующим образом: ((((p0 @ p1) @ p2) @ p3) ... )

может ли кто-нибудь предложить мне правильную формулу смешивания не только для R, G и B, но и для компонента?

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

2 ответов


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

Проверьте классический документ Портера и Даффа"Составление Цифровых Изображений" для чтения и обсуждения всех формул. Вам, вероятно, нужен оператор" over".

Это звучит как вы делаете что-то ближе к рендерингу громкости. Формулу и ссылки см. В разделе графика FAQ, вопрос 5.16 " Как выполнить рендеринг громкости?".


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

вот возможный алгоритм. Начните с конечных цветов пикселей lightr=lightg=lightb=0, lightleft=1;

для каждого R,g,b пиксель встречается оценить:

lightr += lightleft*r*(1-a)
lightg += lightleft*g*(1-a)
lightb += lightleft*b*(1-a)
lightleft *= 1-a;

(значения RGBA нормализованы между 0 и 1, и я предполагаю, что a=1 означает непрозрачный, a=0 означает полностью прозрачный)

Если первый встреченный пиксел синий с непрозрачностью 50%, затем 50% доступного цвета устанавливается в синий, а остальное неизвестно. Если красный пиксель с непрозрачностью 50% Следующий, то 25%оставшиеся свет установлен на красный, поэтому пиксел имеет 50% синий, 25% красный. Если зеленый пиксель с непрозрачностью 60% следующий, то пиксел 50% синий, 25% красный, 15% зеленый, с 10% оставшегося света.

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