unity blend 筆記

blend 就是對透明的物體進行混合的,處於光柵化的最後階段。

例如我們給一個模型貼一個材質,那麼在某個點計算出來顏色值稱爲源,而該點之前累積的顏色值,叫目標。

當我們在顯示這個點顏色值的時候,這個顏色的最終值,就是源和目標疊加出來的。但是這需要我們來規定到底要如何去疊加這個值。

就需要 shader 中的 Blend 命令了。

風宇衝的博客講的很清楚:
http://blog.sina.com.cn/s/blog_471132920101d8z5.html

下面我再貼一遍過來:

語法
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)

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

Blend SrcAlpha OneMinusSrcAlpha
最常用的透明混合方式。貼圖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 外,unity 還有一個 BlendOp 命令,它的參數包括 Add | Min | Max | Sub 。。。等等。
官方文檔地址:
https://docs.unity3d.com/ScriptReference/Rendering.BlendOp.html

這個命令,用來設置合併每個像素的顏色時候的方式,默認是將源和目標顏色進行疊加的,我們可以通過修改參數來取代加的方式。
Min : 取合併顏色對比最小的
Max:取合併顏色對比最大的
詳細的參數可以看官方文檔

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