Posted on 2010-11-14 17:20
點點滴滴 閱讀(417)
評論(0) 編輯 收藏 引用 所屬分類:
05 圖像基礎
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蒙版,然后蓋上去就行了。
不難吧!游戲里(其實也不只游戲,好多算法也是這樣)的一些技術聽起來很玄,說通了也就是那么回事,只不過不是一下子就能想到就是了。
Diablo里面就大量應用了alpha混合技術(至少我看上去象),那些眩目的魔法產生出來的半透明效果,還有亂飛的火球照亮迷宮,每個火球也就是個小的光源,一堆光源產生出來的蒙版(就是對應的alpha相加,超過255就截斷)再蒙上去。(真正的光源應該是這樣的:當alpha值超過255時,alpha=alpha-255,alpha是一個Byte時也就是回繞,同時該點蒙版的色彩變為白色,這才是對的,不過簡單起見,還是原來那樣就可以了)。