原創文章如需轉載請註明:轉載自風宇沖Unity3D教程學院
Shader第十三講
Alpha混合
Alpha Blending,中文譯作Alpha混合Blending就是控制透明的。處於光柵化的最後階段。這裡例如我們給一個模型貼一個材質,那麼在某個點計算出來顏色值稱為源,而該點之前累積的顏色值,叫目標。
文法Blend Off 不混合Blend SrcFactor DstFactor SrcFactor是源係數,DstFactor是目標係數最終顏色 = (Shader計算出的點顏色值 * 源係數)+(點累積顏色 * 目標係數)
屬性(往SrcFactor,DstFactor 上填的值)one 1zero 0SrcColor
源的RGB值,例如(0.5,0.4,1)SrcAlpha 源的A值,
例如0.6DstColor 混合目標的RGB值例如(0.5,0.4,1)DstAlpha 混合目標的A值例如0.6OneMinusSrcColor (1,1,1) - SrcColorOneMinusSrcAlpha 1- SrcAlphaOneMinusDstColor (1,1,1)
- DstColorOneMinusDstAlpha 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組合的情況就先講這麼多了,更多的組合需要自己去試去用,現在請再回過頭看看第五講的引言,是不是有一種恍然大悟的感覺呢?