alpha混合技術

2021-08-23 13:03:37 字數 2501 閱讀 8463

alpha混合技術

alpha混合技術對熟悉遊戲的人來說不會陌生,這種技術在如今的遊戲特效裡已經被用爛了。3d

的遊戲就不說了,2d的遊戲裡,這種技術也是滿眼皆是。

alpha混合聽上去很神秘,實際非常簡單,其作用就是要實現一種半透明效果。假設一種不

透明東西的顏色是a,另一種透明的東西的顏色是b,那麼透過b去看a,看上去的顏色c就是b和a

的混合顏色,可以用這個式子來近似,設b物體的透明度為alpha(取值為0-1,0為完全透明,1

為完全不透明)

r(c)=alpha*r(b)+(1-alpha)*r(a)

g(c)=alpha*g(b)+(1-alpha)*g(a)

b(c)=alpha*b(b)+(1-alpha)*b(a)

r(x)、g(x)、b(x)分別指顏色x的rgb分量。看起來這個東西這麼簡單,可是用它實現的效

果絕對不簡單,應用alpha混合技術,可以實現出最眩目的火光、煙霧、陰影、動態光源等等一

切你可以想象的出來的半透明效果。

火光、煙霧的效果是事先做好乙個火或霧的圖和乙個alpha通道圖(用過photoshop的人都該

知道什麼是alpha通道),畫上去的時候每點每點計算,得到的就是火光掩映的效果。霧化效果

在3d裡還需要模糊一下,在這裡就免了,本來alpha混合就有不小的計算量了,演算法再不優化再

加上模糊或其它的一些什麼原因,那麼你就是在看幻燈片了。(關於優化,網上見仁見智,我再

找時候再講)。

動態光源,聽起來高深的一塌。那我先講一下陰影,這個就簡單了,以往的遊戲也有陰影(

象《仙劍》),不過我們把它公升一下級,從不透明變成半透明而已。就是把乙個影子圖放在地表

上面作alpha混合(而且可以簡化,因為影子的alpha值可以是一定的,這樣就可以大幅提高計算

速度)就ok了。

該講動態光源了。我們把沒有光源的地方想象成一張黑幕蒙在螢幕上,沒光也就什麼都看

不到。那麼我們就加上乙個光源,相當於在黑幕上挖了乙個洞,這個洞的大小就是被照亮的範

圍,現在我們可以看到下面的東西了。但現在這個效果說是光源,倒不如說是個窗戶,要顯得

象光源,就要讓光源的中心最亮,逐漸向四周暗下去,最後到什麼都看不見,這才象個光源。

具體實現就是alpha混合啦,蒙版的顏色是黑,中心alpha值為0,完全透明,到光源的盡頭

alpha值為1,完全不透明,成果就是這個樣子,象這麼回事吧!光源做好了,動態的光源就是

實時生成乙個動態的alpha蒙版,然後蓋上去就行了。

不難吧!遊戲裡(其實也不只遊戲,好多演算法也是這樣)的一些技術聽起來很玄,說通了也

就是那麼回事,只不過不是一下子就能想到就是了。

現在再談談alpha混合。alpha混合指的是給定兩個點p1、p2,其rgb顏色分量分別為

(r1,g1,b1)和(r2,g2,b2),假定p1位於p2的後面,p2的透明度為a(0%點p2看到p1的顏色值是多少。假定該值為p3(r3,g3,b3),其計算公式如下:

r3=(1-a)*r2+a*r1;

g3=(1-a)*g2+a*g1;

b3=(1-a)*b2+a*b1;

這就是通常所說的alpha混合。

優化一下得到:

r3=r2+a*(r1-r2);

g3=g2+a*(g1-g2);

b3=b2+a*(b1-b2);

少做了一次乘法運算。但由於a為浮點數,運算起來仍然很慢,所以一般不採用上面的公式

,而採用整數級的alpha混合,如下:

r2=r2+n*(r1-r2)/256;

g2=g2+n*(g1-g2)/256;

b2=b2+n*(b1-b2)/256;

以上為256級alpha混合公式,由於vga/svga調色盤暫存器為6bits,所以做256色的alpha混

合意義不大。

而採用一下的64級alpha混合公式:

r2=r2+n*(r1-r2)/64;

g2=g2+n*(g1-g2)/64;

b2=b2+n*(b1-b2)/64;

進一步優化為l:

r2=r2+(n*(r1-r2)>>6);

g2=g2+(n*(g1-g2)>>6);

b2=b2+(n*(b1-b2)>>6);

僅做了一次乘法運算,這樣程式應該能跑得飛快了。

下面給出混合乙個點的alpha演算法:

int alpha(int p1,int p2,int n)

對半透明混合,可有如下更快的公式:

r2=r2+((r1-r2)>>1);

g2=g2+((g1-g2)>>1);

b2=b2+((b1-b2)>>1);

這個公式沒有乘法和除法,半透明在遊戲中運用也很廣。

以下是半透明的alpha混合:

int alpha(int p1,int p2,int n)

對於n級alpha混合中的乘法運算,我們也有辦法進一步優化,可以採用移位乘法的技術來

實現快速的乘法運算,但效能提公升不大,有興趣的朋友可以自己查閱相關資料,這裡不再詳述

Alpha混合技術 unity

alpha混合通常是為了實現透明效果,透明效果的程度通過alpha值來控制 混合公式 outputpixel sourcepixel sourceblendfactor destpixel destblendfactor 表示分量乘積 unity中語法如下 blend off 不混合 blend s...

深度測試與alpha混合(3)

alpha源混合係數通常設定為d3dblend srcalpha,即當前繪製畫素的alpha值。目標混合係數設定為d3dblend invsrcalpha,即1減去當前繪製畫素的alpha值。那麼當前繪製畫素的alpha值又是如何得到的呢?如果沒有使用材質和紋理,當前繪製畫素的alpha值來自每個頂...

深度測試與alpha混合(5)

透過那些透明度非常高的物體看其他物體,例如透過幾乎完全透明的玻璃看其他物體,會感到玻璃好像不存在,在三維圖形程式中渲染時就可以不渲染這些透明度非常高的物體,從而可以提高渲染速度,這可以通過alpha測試來實現。alpha測試根據當前畫素是否滿足alpha測試條件 即是否達到一定的透明度 來控制是否繪...