Unity3D教程:Outline Shader 实现外轮廓效果
发表于2017-03-20
这次写了一个简单利用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 效果