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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
4 648
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это можно сделать различными способами, в зависимости от того, как значения 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 «Как выполнить объемный рендеринг?».

Другие вопросы по теме