1. 程式人生 > >主角場景Shader效果:描邊

主角場景Shader效果:描邊

基本思路:Shader用兩個Pass,一個渲染描邊部分,一個渲染物體部分。

Pass1:剔除正面,渲染背面,把頂點延法線方向外圍擴充套件一定寬度,用來表現描邊的粗細,這部分用自己設定的顏色。

Pass2:剔除背面,渲染正面,正常渲染所看到的物體模型。

  1 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'mul(UNITY_MATRIX_MVP,*)'
  2 
  3 Shader "xj/ModelEffect/Outline" {
  4     Properties {
  5         _Color ("
模型顏色", Color) = (1,1,1,1) 6 _OutlineColor ("描邊顏色", Color) = (1,0,0,1) 7 _Outline ("描邊寬度", float) = 0.03 8 _MainTex ("模型貼圖", 2D) = "white" {} 9 _AlphaTex ("Alpha (A)", 2D) = "white" {} 10 _intensity ("強度", float ) = 1.0 11 } 12 13 CGINCLUDE
14 #include "UnityCG.cginc" 15 16 struct appdata { 17 float4 vertex : POSITION; 18 float3 normal : NORMAL; 19 half2 texcoord : TEXCOORD0; 20 }; 21 22 struct v2f { 23 float4 pos : SV_POSITION; 24 fixed4 color : COLOR;
25 half2 texcoord : TEXCOORD0; 26 }; 27 28 struct basevt { 29 float4 pos : SV_POSITION; 30 half2 texcoord : TEXCOORD0; 31 }; 32 33 sampler2D _MainTex; 34 sampler2D _AlphaTex; 35 uniform fixed _Outline; 36 uniform fixed4 _OutlineColor; 37 uniform fixed4 _Color; 38 fixed _intensity; 39 40 v2f outline_vert(appdata v) 41 { 42 //在vertex階段,每個頂點按照法線的方向偏移一部分,不過這種會造成近大遠小的透視問題 43 //正確的做法是轉換到投影空間下做偏移 44 //v.vertex.xyz += v.normal * _Outline; 45 46 v2f o; 47 o.pos = mul(UNITY_MATRIX_MVP,v.vertex); 48 float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); 49 float2 offset = TransformViewToProjection(norm.xy); 50 o.pos.xy += offset * _Outline; 51 o.color = _OutlineColor; 52 o.texcoord = v.texcoord; 53 return o; 54 } 55 56 fixed4 outline_frag(v2f i): SV_Target 57 { 58 fixed4 color = i.color; 59 color.a = tex2D(_AlphaTex, i.texcoord).a; 60 return color; 61 } 62 63 basevt base_vert(appdata v) 64 { 65 basevt o; 66 o.pos = mul(UNITY_MATRIX_MVP,v.vertex); 67 o.texcoord = v.texcoord; 68 return o; 69 } 70 71 fixed4 base_frag(basevt i): SV_Target 72 { 73 fixed4 col = tex2D(_MainTex, i.texcoord) * _Color * _intensity; 74 col.a = tex2D(_AlphaTex, i.texcoord).a * _Color.a; 75 return col; 76 } 77 ENDCG 78 79 SubShader { 80 Tags { "Queue" = "Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} 81 Fog {Mode Off} 82 83 Pass 84 { 85 Name "OUTLINE" 86 Cull Front //剔除正面 87 CGPROGRAM 88 89 #pragma vertex outline_vert 90 #pragma fragment outline_frag 91 #pragma fragmentoption ARB_precision_hint_fastest 92 93 ENDCG 94 } 95 96 Pass 97 { 98 Name "BASE" 99 Cull Back //剔除背面 100 CGPROGRAM 101 102 #pragma vertex base_vert 103 #pragma fragment base_frag 104 #pragma fragmentoption ARB_precision_hint_fastest 105 106 ENDCG 107 } 108 } 109 FallBack "xj/Default" 110 }