Shader:十三Alpha混合

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透明通道處理。

【風宇衝】Shader:十三Alpha混合

 

Blend one  zero:  顯示貼圖的RGB部分,無Alpha透明通道處理。 A通道爲0即本應該透明的地方也渲染出來了。

【風宇衝】Shader:十三Alpha混合

 

Blend one  one:貼圖和背景疊加,無Alpha透明通道處理。僅僅是顏色rgb數值的疊加更趨近於白色即(1,1,1)了。

【風宇衝】Shader:十三Alpha混合

 

Blend SrcAlpha  zero:僅僅顯示貼圖,貼圖含Alpha透明通道處理。但是貼圖中的透明部分,即下圖黑色部分沒有顏色來顯示,因爲源顏色乘以alpha值0,爲0;而混合目標的顏色乘以zero 0,也是0。所以透明部分顯示的顏色爲(0,0,0)

【風宇衝】Shader:十三Alpha混合

 

 

Blend SrcAlpha  OneMinusSrcAlpha:

【風宇衝】Shader:十三Alpha混合

最終顏色 = 源顏色 * 源透明值 + 目標顏色*(1 - 源透明值)

最常用的透明混合方式。貼圖alpha值高的部分,顯示得實,而混合的背景很淡。而alpha值高的部分,貼圖顯示得淡,而背景現實得實。

舉例:

(1)假設貼圖有一個不透明紅色點【風宇衝】Shader:十三Alpha混合, Color(1,0,0,1),該點背景色爲不透明藍色 【風宇衝】Shader:十三Alpha混合Color(0,0,1,1)

最終顏色 =  (1,0,0)* 1+(0,0,1)*(1-1) = (1,0,0)【風宇衝】Shader:十三Alpha混合

結論一:貼圖alpha值爲1時,僅顯示貼圖,不顯示背景

 

(2)假設貼圖有一個透明紅色點【風宇衝】Shader:十三Alpha混合, Color(1,0,0,0),該點背景色爲透明,但B通道值爲1,即Color(0,0,1,0)

最終顏色 =  (1,0,0)* 0+(0,0,1)*(1-0) = (0,0,1)【風宇衝】Shader:十三Alpha混合

結論二:貼圖alpha值爲0時,僅顯示混合目標即背景,不顯示貼圖

但是目標alpha值爲0,即其實這個點的背景是透明的,而我們卻把它顯示出來了,這就不對了。

經驗:帶A通道的貼圖中,空的地方不只A值爲0,RGB值也要爲0,不然容易出錯。

 

(3)假設貼圖有一個半透明紅色點【風宇衝】Shader:十三Alpha混合, Color(1,0,0,0.8),該點背景色爲不透明藍色【風宇衝】Shader:十三Alpha混合 Color(0,0,1,1)

最終顏色 =  (1,0,0)* 0.8+(0,0,1)*(1-0.8) = (0.8,0,0.2)【風宇衝】Shader:十三Alpha混合

而假如0.8變爲0.2時,

最終顏色 =  (1,0,0)* 0.2+(0,0,1)*(1-0.2) = (0.2,0,0.8)【風宇衝】Shader:十三Alpha混合

結論:貼圖alpha值越大,顏色越偏向貼圖;alpha值越小,顏色越偏向混合目標

 

Blend組合的情況就先講這麼多了,更多的組合需要自己去試去用,現在請再回過頭看看第五講的引言,是不是有一種恍然大悟的感覺呢?

  轉載自 http://blog.sina.com.cn/lsy835375

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章