這篇文章主要說的是關(guān)于Unity Shader 中對Alpha的Blend
Blend 透明度混合.通過參數(shù)來調(diào)整透明度,真正的透明效果.
Blend的位置在SubShader 中,CGPROGRAM前.用例如下
Shader "Example/Diffuse Bump" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Bumpmap", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
==注意看這里==
Blend One One
CGPROGRAM
#pragma surface surf Lambert
// 略
ENDCG
}
Fallback "Diffuse"
}
好的.我們著重來看下Blend One One 部分
混合命令有一下這些:
參數(shù) | 描述 |
---|---|
Blend Off | 關(guān)閉混合(默認(rèn)) |
Blend SrcFactor DstFactor | 片元產(chǎn)生的顏色乘以SrcFactor,加上屏幕上已有的顏色乘以DstFactor,得到最終的顏色(寫入顏色緩存),示例: float4 result = SrcFactor * fragment_output + DstFactor * pixel_color |
Blend SrcFactor DstFactor,SrcFactorA, DstFactorA | 同上,只不過使用單獨(dú)的因子SrcFactorA和DstFactorA來混合透明度通道 |
BlendOp BlendOperation | 用其他的操作來取代加法混合 |
BlendOp OpColor,OpAlpha | 同上,只不過對于透明度通道使用不同的操作 |
==測試在Unity 中 Blend SrcFactor DstFactor,SrcFactorA, DstFactorA 命令失效,unity只認(rèn) Blend SrcFactor DstFactor 這種形式, "," 后面的參數(shù)不認(rèn),但是調(diào)試中發(fā)現(xiàn)Unity生成的是 Blend One One,One One 這樣的4個(gè)參數(shù)的形式.很是不解==
混合操作(BlendOp) | 具體操作 |
---|---|
Add | 加法:float4 result = SrcFactor * fragment_output + DstFactor * pixel_color |
Sub | 減法( 源-目標(biāo)): float4 result = SrcFactor * fragment_output - DstFactor * pixel_color |
RevSub | 減法(目標(biāo)-源): float4 result = DstFactor * pixel_color - SrcFactor * fragment_output |
Min | 較小值(逐個(gè)通道比較) |
Max | 較大值(逐個(gè)通道比較) |
常用的混合命令有:
Blend SrcAlpha OneMinusSrcAlpha // 傳統(tǒng)透明度
Blend One OneMinusSrcAlpha // 預(yù)乘透明度
Blend One One // 疊加
Blend OneMinusDstColor One // 柔和疊加
Blend DstColor Zero // 相乘——正片疊底
Blend DstColor SrcColor // 兩倍相乘
Blend 參數(shù)值說明. fragment_output 為片元產(chǎn)生的顏色,pixel_color為緩存區(qū)的顏色
Blend {code for SrcFactor} {code for DstFactor}
Code | 代表的值 |
---|---|
One | float4(1.0, 1.0, 1.0, 1.0) |
Zero | float4(0.0, 0.0, 0.0, 0.0) |
SrcColor | fragment_output |
SrcAlpha | fragment_output.aaaa |
DstColor | pixel_color |
DstAlpha | pixel_color.aaaa |
OneMinusSrcColor | float4(1.0, 1.0, 1.0, 1.0) - fragment_output |
OneMinusSrcAlpha | float4(1.0, 1.0, 1.0, 1.0) - fragment_output.aaaa |
OneMinusDstColor | float4(1.0, 1.0, 1.0, 1.0) - pixel_color |
OneMinusDstAlpha | float4(1.0, 1.0, 1.0, 1.0) - pixel_color.aaaa |
之前看過一些文章,誤以為Blend One One 最后產(chǎn)生的值也會對透明度產(chǎn)生影響,后來經(jīng)過實(shí)際測試,發(fā)現(xiàn)沒有效果,因?yàn)榘凑展?float4 result = SrcFactor * fragment_output + DstFactor * pixel_color
result是包括含透明度的,其實(shí)不然,雖然result包含透明度的值,但是最終呈現(xiàn)到屏幕后Alpha會被舍棄,而這一步是最后一步計(jì)算顏色的地方,所以O(shè)ne*fragment_output 得到的值還是原來的值,透明度沒有被改變,
如果是 Blend SrcAlpha One,那么就變成了
Blend SrcAlpha One
result=fragment_output.aaaa*fragment_output.rgba+float4(1,1,1,1)*pixel_color
result=fragment_output(a*r,a*g,a*b,a*a)+pixel_color
顏色值與Alpha相乘,顏色值被改變.
先寫到這里,有紕漏之處還望指教.
參考鏈接 https://en.wikibooks.org/wiki/Cg_Programming/Unity/Transparency