Unity3D教程:Outline Shader 实现外轮廓效果

发表于2017-03-20
评论0 9.3k浏览
这次写了一个简单利用Outline Shader 实现外轮廓效果,这个效果在游戏中常常应用在:选取物件、卡通风格中,如果对Outline Shader 实现外轮廓效果感兴趣的话,可以继续往下看。

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Shader "Unlit/Outline Shader"
{
    Properties
    {
        _MainTex ("Base (RGB)", 2D) = "white" { }
        _OutlineColor ("Outline Color", Color) = (0, 0, 0, 1)
        _OutlineWidth ("Outline width", Range (0.0, 1.0)) = .005
    }
      
    SubShader
    {
        Pass
        {
            Cull front
              
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
              
            #include "UnityCG.cginc"
              
            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };
              
            struct v2f
            {
                float4 pos : POSITION;
            };
              
            uniform float _OutlineWidth;
            uniform float4 _OutlineColor;
              
            v2f vert(appdata v)
            {
                v2f o;
                  
                float3 norm = normalize(v.normal);
                v.vertex.xyz += v.normal * _OutlineWidth;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                  
                return o;
            }
              
            half4 frag(v2f i) : COLOR
            {
                return _OutlineColor;
            }
            ENDCG
        }
          
        Pass
        {
            SetTexture [_MainTex]
            {
                Combine Primary * Texture
            }
        }
    }
}
主要的实作是在第一个 Pass 通道中
Cull front 是用来剔除面向镜头方向的多边形
只显示背对镜头的多边形
而在 vert 中
动态改变模型的 vertex 座标
并画上 _OutlineColor
来达到模拟模型轮廓的效果

接著在第二个 Pass 通道中
利用简单的 Fixed Pipeline
来进行模型贴图的绘製

原始效果

Shader 效果



如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引