Alpha Blending,中文譯作Alpha混合
Blending就是控制透明的。處於光柵化的最後階段。
這裏例如我們給一個模型貼一個材質,那麼在某個點計算出來顏色值稱爲源,而該點之前累積的顏色值,叫目標。
語法
Blend Off 不混合
Blend SrcFactor DstFactor SrcFactor是源係數,DstFactor是目標係數
最終顏色 = (Shader計算出的點顏色值 * 源係數)+(點累積顏色 * 目標係數)
屬性(往SrcFactor,DstFactor 上填的值)
one 1
zero 0
SrcColor 源的RGB值,例如(0.5,0.4,1)
SrcAlpha 源的A值, 例如0.6
DstColor 混合目標的RGB值例如(0.5,0.4,1)
DstAlpha 混合目標的A值例如0.6
OneMinusSrcColor (1,1,1) - SrcColor
OneMinusSrcAlpha 1- SrcAlpha
OneMinusDstColor (1,1,1) - DstColor
OneMinusDstAlpha 1- DstAlpha
運算法則示例:
(注:r,g,b,a,x,y,z取值範圍爲[0,1])
(r,g,b) * a = (r*a , g*a , b*a)
(r,g,b) * (x,y,z) = (r*x , g*y , b*z)
(r,g,b) + (x,y,z) = (r+x , g+y , b+z)
(r,g,b) - (x,y,z) = (r-x , g-y , b-z)
在樹葉使用的Shader中添加Blend代碼
Blend zero one:僅顯示背景的RGB部分,無Alpha透明通道處理。
Blend one zero: 僅顯示貼圖的RGB部分,無Alpha透明通道處理。 A通道爲0即本應該透明的地方也渲染出來了。
Blend one one:貼圖和背景疊加,無Alpha透明通道處理。僅僅是顏色rgb數值的疊加更趨近於白色即(1,1,1)了。
Blend SrcAlpha zero:僅僅顯示貼圖,貼圖含Alpha透明通道處理。但是貼圖中的透明部分,即下圖黑色部分沒有顏色來顯示,因爲源顏色乘以alpha值0,爲0;而混合目標的顏色乘以zero 0,也是0。所以透明部分顯示的顏色爲(0,0,0)
Blend SrcAlpha OneMinusSrcAlpha:
最終顏色 = 源顏色 * 源透明值 + 目標顏色*(1 - 源透明值)
最常用的透明混合方式。貼圖alpha值高的部分,顯示得實,而混合的背景很淡。而alpha值高的部分,貼圖顯示得淡,而背景現實得實。
舉例:
(1)假設貼圖有一個不透明紅色點, Color(1,0,0,1),該點背景色爲不透明藍色
Color(0,0,1,1)
最終顏色 = (1,0,0)* 1+(0,0,1)*(1-1) = (1,0,0)
結論一:貼圖alpha值爲1時,僅顯示貼圖,不顯示背景
(2)假設貼圖有一個透明紅色點, Color(1,0,0,0),該點背景色爲透明,但B通道值爲1,即Color(0,0,1,0)
最終顏色 = (1,0,0)* 0+(0,0,1)*(1-0) = (0,0,1)
結論二:貼圖alpha值爲0時,僅顯示混合目標即背景,不顯示貼圖
但是目標alpha值爲0,即其實這個點的背景是透明的,而我們卻把它顯示出來了,這就不對了。
經驗:帶A通道的貼圖中,空的地方不只A值爲0,RGB值也要爲0,不然容易出錯。
(3)假設貼圖有一個半透明紅色點, Color(1,0,0,0.8),該點背景色爲不透明藍色
Color(0,0,1,1)
最終顏色 = (1,0,0)* 0.8+(0,0,1)*(1-0.8) = (0.8,0,0.2)
而假如0.8變爲0.2時,
最終顏色 = (1,0,0)* 0.2+(0,0,1)*(1-0.2) = (0.2,0,0.8)
結論:貼圖alpha值越大,顏色越偏向貼圖;alpha值越小,顏色越偏向混合目標
Blend組合的情況就先講這麼多了,更多的組合需要自己去試去用,現在請再回過頭看看第五講的引言,是不是有一種恍然大悟的感覺呢?
轉載自 http://blog.sina.com.cn/lsy835375