2008-09-30 5 views
6

Mam kilka pikseli RGBA, każdy z nich ma składnik alfa.Jaka jest formuła mieszania alfa dla wielu pikseli?

Mam więc listę pikseli: (p0 p1 p2 p3 p4 ... pn) gdzie p_0_ jest przednim pikselem, a p_n_ jest najdalszym (z tyłu).

Ostatni (lub dowolny) piksel nie jest konieczny jako nieprzezroczysty, więc wynikowy zmiksowany piksel może być w jakiś sposób przezroczysty. Łączę się od początku listy do końca, a nie odwrotnie (tak, to jest raytracing). Więc jeśli wynik w dowolnym momencie stanie się wystarczająco nieprzejrzysty, mogę zatrzymać się z wynikiem wystarczająco poprawnym. będę zastosowanie algorytmu mieszania w ten sposób: ((((p0 @p1) @p2) @P3) ...)

Czy ktoś może zaproponować mi poprawną formułę mieszania nie tylko dla R, G i B, ale także dla komponentu A?

UPD: Zastanawiam się, jak to możliwe, że dla określonego procesu mieszania kolorów możemy mieć wiele formuł? Czy to aproksymacja? To wygląda szalenie, jak dla mnie: formuły nie są tak różne, że naprawdę zyskujemy na wydajności lub optymalizacji. Czy ktoś może to wyjaśnić?

Odpowiedz

10

Alfa-blending to jeden z tych tematów, który ma głębsze niż myślisz. To zależy od tego, co oznacza wartość alpha w twoim systemie, a jeśli zgadniesz, że źle, to skończysz z wynikami, które wyglądają w porządku, ale wyświetlają dziwne artefakty.

Sprawdź klasyczny artykuł Portera i Duffa "Compositing Digital Images", aby uzyskać wspaniałą, czytelną dyskusję i wszystkie formuły. Prawdopodobnie potrzebujesz operatora "nad".

Wygląda na to, że robisz coś bliższego renderowaniu objętości. Aby uzyskać wzór i referencje, zobacz pytanie Graphics FAQ, pytanie 5.16 "Jak wykonać renderowanie wolumenu?".

+0

Świetne linki, człowieku! Dziękuję Ci bardzo! – avp

2

Można to zrobić na różne sposoby, w zależności od tego, w jaki sposób wartości RGBA faktycznie reprezentują właściwości materiałów.

Oto możliwy algorytm. Zacznij od końcowych kolorów pikseli: lightr=lightg=lightb=0, lightleft=1;

Na każdy R, G, B, piksel spotykane ocenić:

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

(Wartości RGBA są znormalizowane między 0 i 1, a ja przy założeniu, że a = 1 oznacza, nieprzezroczysty, a = 0 oznacza całkowicie przezroczysty)

Jeśli pierwszy piksel napotkany jest niebieski z kryciem 50%, to 50% dostępnego koloru jest ustawione na niebieski, a reszta nieznana. Jeśli czerwony piksel o przezroczystości 50% jest następny, wtedy 25% z pozostałego światła jest ustawione na czerwony, więc piksel ma 50% niebieskiego, 25% czerwonego. Jeśli zielony piksel z przezroczystością 60% jest następny, piksel jest 50% niebieski, 25% czerwony, 15% zielony, a 10% pozostałego światła.

Fizycznymi materiałami, które odpowiadają tej funkcji są emitujące światło, ale częściowo nieprzezroczyste materiały: w ten sposób piksel na środku stosu nigdy nie może przyciemnić ostatecznego koloru: może tylko zapobiec oświetleniu za nim zwiększeniu ostatecznego koloru (będąc czarnym i całkowicie nieprzejrzystym).

Powiązane problemy