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

StackOverflow https://stackoverflow.com/questions/154079

Вопрос

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

Итак, у меня есть список пикселей:(р0 р1 р2 р3 р4 ...pn) где p_0_ - передний пиксель, а p_n__ - самый дальний (сзади).

Последний (или любой другой) пиксель необязательно непрозрачен, поэтому результирующий смешанный пиксель также может быть каким-то образом прозрачным.Я смешиваю от начала списка до конца, а не наоборот (да, это трассировка лучей).Таким образом, если результат в какой-то момент станет достаточно непрозрачным, я могу остановиться на достаточно правильном результате.Я применю алгоритм смешивания следующим образом:((((p0 @ р1) @ р2) @ р3) ... )

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

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

Это было полезно?

Решение

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

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

Похоже, вы делаете что-то более близкое к объемному рендерингу.Формулу и ссылки см. В Часто задаваемые вопросы по графике, вопрос 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% светлого.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top