混合 - Blending
- 混合适用于半透明物体,只能在最后进行,因为之前的阶段,每个三角形,每个片元都是不认识的,没办法做混合。
- 混合过程:把当前片元的颜色值和帧缓存中的颜色值通过Apha值做计算。
- 混合方程:SrcColor×SrcFactor + DstColor × DstFactor
Alpha Test
- Alpha Test 不使用混合,而是根据Alpha值进行裁切,即要么丢弃片元,要么留下片元。
- Alpha Test 的物体可以放到不透明队列中,也可以放到半透明队列中渲染。
Alpha Test的应用场景
- Alpha Test 对只需要不透明和全透明的物体很有用。
- 叶子、小草,有细节的圆洞等,如果用网格来表达会多出很多面片,制作时间长,调整起来慢,同屏面数多。Alpha Test 使用纹理图片判断需要渲染的区域,可以很好的渲染这些物体。
Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Shader "Example Alpha Test"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_Cutoff("Cut off",range(0,1))=0.5
}
...
SubShader
{
...
// Alpha Test示例
Pass
{
struct v2f {
float4 pos : SV_POSITION;
float4 uv:TEXCOORD0;
};
v2f vert(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); // 转换顶点空间
o.uv = v.texcoord; // 传递UV值
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// 根据UV获取纹理上的纹素
fixed4 _color = tex2D(_MainTex,i.uv.xy);
// clip函数检查参数是否小于0
// 如果小于0就discard fragment,否则就放过它
clip(_color.a - _Cutoff);
return _color;
}
}
}
...
}