天天看點

Alpha混合

ShaderLab syntax: Blending 混合

Blending is used to make transparent objects.

混合是用來制作透明物體的。

Alpha混合

When graphics are rendered, after all shaders have executed and all textures have been applied, the pixels are written to the screen. How they are combined with what is already there is controlled by the Blend command.

在所有着色器執行完畢,所有紋理都被應用,所有像素準備被呈現到螢幕之後, 使用Blend指令來操作這些像素進行混合。

指導:

Blend 混合是将源色和目标色以某種方式混合生成特效的技術。混合常用來繪制透明或半透明的物體。在混合中起關鍵作用的α值實際上是将源色和目标色按給定比率進行混合,以達到不同程度的透明。α值為0則完全透明,α值為1則完全不透明。混合操作隻能在RGBA模式下進行,顔色索引模式下無法指定α值。物體的繪制順序會影響到OpenGL的混合處理。

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

Alpha混合

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

Alpha混合

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

Alpha混合

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

Alpha混合

Blend SrcAlpha  OneMinusSrcAlpha:

Alpha混合

最終顔色 = 源顔色 * 源透明值 + 目标顔色*(1 - 源透明值)

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

舉例:

Alpha混合
Alpha混合

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

Alpha混合
Alpha混合

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

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

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

Alpha混合
Alpha混合

而假如0.8變為0.2時,

Alpha混合

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

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

繼續閱讀