Home 半透明物体的渲染
Post
Cancel

半透明物体的渲染

混合 - Blending

  1. 混合适用于半透明物体,只能在最后进行,因为之前的阶段,每个三角形,每个片元都是不认识的,没办法做混合。
  2. 混合过程:把当前片元的颜色值和帧缓存中的颜色值通过Apha值做计算。
  3. 混合方程:SrcColor×SrcFactor + DstColor × DstFactor

image-20230205123310083

Alpha Test

  1. Alpha Test 不使用混合,而是根据Alpha值进行裁切,即要么丢弃片元,要么留下片元。
  2. Alpha Test 的物体可以放到不透明队列中,也可以放到半透明队列中渲染。

Alpha Test的应用场景

  1. Alpha Test 对只需要不透明和全透明的物体很有用。
  2. 叶子、小草,有细节的圆洞等,如果用网格来表达会多出很多面片,制作时间长,调整起来慢,同屏面数多。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;
            }
        }
    }

    ...
}
This post is licensed under CC BY 4.0 by the author.