У меня есть несколько пикселей RGBA, каждый из которых имеет альфа-компонент.
Итак, у меня есть список пикселей: (p0 p1 p2 p3 p4 ... pn), где p_0_ - передний пиксель, а p_n_ - самый дальний (сзади).
Последний (или любой) пиксель не обязательно должен быть непрозрачным, поэтому полученный смешанный пиксель также может быть каким-то образом прозрачным. Я смешиваю от начала списка до конца, а не наоборот (да, это трассировка лучей). Так что если результат в какой-то момент станет достаточно непрозрачным, я могу остановиться с достаточно правильным результатом. Я применяю алгоритм смешивания следующим образом: ((((p0 @ p1) @ p2) @ p3) ...)
Может ли кто-нибудь предложить мне правильную формулу смешивания не только для R, G и B, но и для компонента A?
UPD: Интересно, как это возможно, что для определенного процесса смешивания цветов у нас может быть много формул? Это какое-то приближение? Это выглядит безумно, как по мне: формулы не настолько разные, чтобы мы действительно получали эффективность или оптимизацию. Кто-нибудь может это прояснить?





Это можно сделать различными способами, в зависимости от того, как значения 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% света.
Физические материалы, которые соответствуют этой функции, являются светоизлучающими, но частично непрозрачными материалами: таким образом, пиксель в середине стопки никогда не может затемнить конечный цвет: он может только препятствовать тому, чтобы свет позади него увеличивал конечный цвет (будучи черным и полностью непрозрачный).
Альфа-смешение - одна из тех тем, которая глубже, чем вы думаете. Это зависит от того, что означает значение альфа в вашей системе, и если вы угадаете неверно, то в конечном итоге вы получите результаты, которые выглядят нормально, но демонстрируют странные артефакты.
Ознакомьтесь с классической статьей Портера и Даффа «Создание цифровых изображений», чтобы получить отличное, удобочитаемое обсуждение и все формулы. Вероятно, вам нужен оператор «сверх».
Похоже, вы делаете что-то похожее на объемный рендеринг. Формулу и ссылки см. В Графика FAQ, вопрос 5.16 «Как выполнить объемный рендеринг?».