1.如果Shader代碼內(nèi)辈讶,沒有寫到Blend舔稀,那么模式Blend Off 是不進行混合的。
下面測試一下Blend的各種模式尤泽,先交代一下各個參數(shù)代表的含義
SrcColor 要渲染的顏色骄酗,比如某張貼圖進行繪制的時候稀余,該貼圖就是要渲染的顏色SrcColor
SrcAlpha 要渲染的透明度,同上
DstColor 已經(jīng)渲染到屏幕上的顏色
DstAlpha 已經(jīng)渲染到屏幕上的顏色透明度
One MinusSrcColor 1-要渲染的顏色
One MinusSrcAlpha 1-要渲染 透明度
One MiusDstColor 1-屏幕上顯示的顏色
One MinusDstAlpha 1-屏幕上顯示顏色的alpha
看一下各種參數(shù)效果趋翻。兩張素材圖:一張不透明的背景圖,一張四角透明的icon圖
Blend Off 關閉混合,效果如下
很明顯盒蟆,四角透明并沒有顯示出底圖來踏烙。
(1)現(xiàn)在想要一個簡單的混合,只描述這個Icon历等,不透明的部分讨惩,就是顯示icon內(nèi)容,透明的部分顯示背景圖寒屯。
公式如下:
Blend SrcAlpha OneMiusSrcAlpha 這個實際算法是:SrcColorSrcAlpha + (1-SrcAlpha)DstColor
(2)Blend One One 源色+目標色 正常的疊加,效果會比之前的亮,畢竟rgb 都增加了
(3)Blend SrcAlpha One 源色*源Alpha + 目標色,這個效果跟 (2)效果很近荐捻,都會增亮
這個沒有白色區(qū)域,是因為 源色源Alpha
(4)Blend OneMinusSrcAlpha One (1-源Alpha)源色 + 目標色
很明顯寡夹,源色透明區(qū)域顯示了白色处面,非透明區(qū)域顯示了背景色
(5)Blend OneMinusDstAlpha One (1-DstAlpha)SrcColor + DstColor
(6)Blend DstColor Zero DstColorSrcColor + 0DstColor
(7)Blend OneMinusDstColor Zero (1-DstColor)SrcColor + 0DstColor
效果是,源色透明的區(qū)域有了點背景的樣子
(8)Blend Zero SrcAlpha 0源色 + 源Alpha目標色
具體的效果菩掏,需要根據(jù)公式推算一下魂角,甚至是 嘗試一下。
附代碼:
Shader "Blend/BlendTest"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" }
//不寫B(tài)lend的時候也是默認Blend Off 只顯示源色智绸,不會混合上Gbuff上的色素野揪。(目前測試的是透明部分顯示了白色)
//Blend Off
//(1)公式: 源色*源Alpha + (1-源Alpha)*目標色
//Blend SrcAlpha OneMinusSrcAlpha
//(2)效果是:疊加访忿,顏色會比之前亮 。疊加的時候會不會考慮Alpha 斯稳?
//Blend One One
//(3)得到的圖案是背景圖正常海铆,透明區(qū)域正常顯示背景,非透明區(qū)域變亮了
//Blend SrcAlpha One
//(4)公式:(1-源Alpha)*源色 + 目標色 :效果是 源色透明區(qū)域顯示白色挣惰,不透明區(qū)域顯示背景
//Blend OneMinusSrcAlpha One
//(5)公式:(1-DstAlpha)*SrcColor + DstColor :效果是源色沒有顯示出來卧斟,因為背景是不透明的
//Blend OneMinusDstAlpha One
//(6)DstColor*SrcColor + 0*DstColor
//Blend DstColor Zero
//(7)(1-DstColor)*SrcColor + 0*DstColor :效果是透明區(qū)域,有了點背景的樣子
//Blend OneMinusDstColor Zero
Blend Zero SrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
//用下面的方法取uv 通熄,是為了讓uv 受tilng 跟offset 影響
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}