2008-09-30 165 views
6

我有一些RGBA像素,每個像素都有一個alpha分量。許多像素的alpha混合公式是什麼?

所以我有一個像素列表:(p0 p1 p2 p3 p4 ... pn)其中p_0_是前像素,p_n_是最遠的(在後面)。

最後(或任何)像素不是必需的不透明,所以最終的混合像素也可以以某種方式透明。 我從列表的開頭混合到最後,而不是反過來(是的,它是光線跟蹤)。所以如果結果在任何時候都變得不透明,我可以用足夠正確的結果來阻止。 (@P2)(((P0 @P1)@P3)...)

任何人都可以建議我一個正確的混合式: 我會應用混合算法,以這種方式不僅對於R,G和B,而且對於A組件也是如此?

UPD:我想知道如何確定混合顏色的過程,我們可以有許多公式?這是一種aproximation?這看起來很瘋狂,至於我:公式並沒有太大的不同,我們真的獲得了效率或優化。任何人都可以澄清這一點?

回答

10

Alpha混合是比您想象的更深入的主題之一。這取決於系統中alpha值的含義,如果你猜錯了,那麼最終結果看起來不錯,但顯示的是奇怪的工件。

查看Porter和Duff的經典論文「Compositing Digital Images」,獲得一個偉大的,可讀的討論和所有的公式。你可能想要「over」操作符。

這聽起來像你正在做一些更接近於體積渲染的東西。有關公式和參考文獻,請參閱Graphics FAQ,問題5.16「如何執行體積渲染?」。

+0

偉大的聯繫,男人!非常感謝你! – avp 2008-10-01 08:09:56

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之間的歸一化,並且我假設一個= 1表示不透明,α= 0意味着完全透明)

如果遇到的第一個像素是不透明度爲50%的藍色,則50%的可用顏色設置爲藍色,其餘未知。如果下一個不透明度爲50%的紅色像素,則其餘光線的25%會被設置爲紅色,因此該像素具有50%的藍色,25%的紅色。如果下一個不透明度爲60%的綠色像素,則該像素爲50%藍色,25%紅色,15%綠色,剩餘10%的光線。

與此功能相對應的物理材料是發光但部分不透明的材料:因此,堆疊中間的像素不會使最終顏色變暗:它只能防止其後面的光線增加最終顏色(通過黑色和完全不透明)。