原文地址:http://blog.sina.com.cn/s/blog_471132920101d8z5.html
Shader第十三講
Alpha混合
Alpha Blending,中文譯作Alpha混合
Blending就是控制透明的徽鼎。處于光柵化的最后階段。
這里例如我們給一個模型貼一個材質,那么在某個點計算出來顏色值稱為源音婶,而該點之前累積的顏色值棒拂,叫目標姑隅。
語法
Blend Off 不混合
Blend SrcFactor DstFactor SrcFactor是源系數(shù)写隶,DstFactor是目標系數(shù)
最終顏色 = (Shader計算出的點顏色值 * 源系數(shù))+(點累積顏色 * 目標系數(shù))
屬性(往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 = (ra , ga , b*a)
(r,g,b) * (x,y,z) = (rx , gy , 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即本應該透明的地方也渲染出來了趁矾。
Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
Blend one one:
貼圖和背景疊加耙册,無Alpha透明通道處理。僅僅是顏色rgb數(shù)值的疊加更趨近于白色即(1愈魏,1觅玻,1)了。
Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" action-data="http%3A%2F%2Fs7.sinaimg.cn%2Fmw690%2F47113292gd11a65a33a96%26690" action-type="show-slide" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
Blend SrcAlpha zero:僅僅顯示貼圖
培漏,貼圖含Alpha透明通道處理溪厘。但是貼圖中的透明部分,即下圖黑色部分沒有顏色來顯示牌柄,因為源顏色乘以alpha值0畸悬,為0;而混合目標的顏色乘以zero 0珊佣,也是0蹋宦。所以透明部分顯示的顏色為(0,0咒锻,0)
Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" action-data="http%3A%2F%2Fs11.sinaimg.cn%2Fmw690%2F47113292gd11a662a367a%26690" action-type="show-slide" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
Blend SrcAlpha OneMinusSrcAlpha:
Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" action-data="http%3A%2F%2Fs16.sinaimg.cn%2Fmw690%2F47113292gd11aa9dbceef%26690" action-type="show-slide" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
最終顏色 = 源顏色 * 源透明值 + 目標顏色(1 - 源透明值)
最常用的透明混合方式冷冗。貼圖alpha值高的部分,顯示得實惑艇,而混合的背景很淡蒿辙。而alpha值高的部分,貼圖顯示得淡滨巴,而背景現(xiàn)實得實思灌。
舉例:
(1)假設貼圖有一個不透明紅色點Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">, Color(1恭取,0泰偿,0,1)蜈垮,該點背景色為不透明藍色 Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">Color(0耗跛,0裕照,1,1)
最終顏色 = (1课兄,0牍氛,0) 1+(0,0烟阐,1)*(1-1) = (1搬俊,0,0)Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
結論一:貼圖alpha值為1時蜒茄,僅顯示貼圖唉擂,不顯示背景
(2)假設貼圖有一個透明紅色點Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">, 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混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
結論二:貼圖alpha值為0時变隔,僅顯示混合目標即背景规伐,不顯示貼圖
但是目標alpha值為0,即其實這個點的背景是透明的匣缘,而我們卻把它顯示出來了猖闪,這就不對了。
經(jīng)驗:帶A通道的貼圖中孵户,空的地方不只A值為0萧朝,RGB值也要為0岔留,不然容易出錯夏哭。
(3)假設貼圖有一個半透明紅色點Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">, Color(1献联,0竖配,0何址,0.8),該點背景色為不透明藍色Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;"> Color(0进胯,0用爪,1,1)
最終顏色 = (1胁镐,0偎血,0)* 0.8+(0,0盯漂,1)(1-0.8) = (0.8颇玷,0,0.2)Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
而假如0.8變?yōu)?.2時就缆,
最終顏色 = (1帖渠,0,0) 0.2+(0竭宰,0空郊,1)*(1-0.2) = (0.2,0切揭,0.8)Alpha混合" title="【風宇沖】Unity3D教程寶典之Shader篇:第十三講 Alpha混合" style="margin: 0px; padding: 0px; border: 0px; list-style: none;">
結論:貼圖alpha值越大狞甚,顏色越偏向貼圖;alpha值越小伴箩,顏色越偏向混合目標
Blend組合的情況就先講這么多了入愧,更多的組合需要自己去試去用,現(xiàn)在請再回過頭看看第五講的引言嗤谚,是不是有一種恍然大悟的感覺呢棺蛛?