Unity3D带自发光及边缘高光的shader
1 Shader "Custom/Ill_RimLight" 2 { 3 Properties { 4 _Color ("Main Color", Color) = (.5,.5,.5,1) 5 _OutlineColor ("Rim Color", Color) = (0,0,0,1) 6 _Outline ("Rim width", Range (.002, 0.03)) = .005 7 _MainTex ("Base (RGB)", 2D) = "white" { } 8 _Illum ("Illumin (A)", 2D) = "white" { } 9 _EmissionLM ("Emission (Lightmapper)", Float) = 0 10 } 11 12 SubShader 13 { 14 15 Tags { "RenderType"="Opaque" } 16 LOD 200 17 18 CGPROGRAM 19 #pragma surface surf Lambert 20 21 sampler2D _MainTex; 22 sampler2D _Illum; 23 fixed4 _Color; 24 25 struct Input { 26 float2 uv_MainTex; 27 float2 uv_Illum; 28 }; 29 30 void surf (Input IN, inout SurfaceOutput o) { 31 fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); 32 fixed4 c = tex * _Color; 33 o.Albedo = c.rgb; 34 o.Emission = c.rgb * tex2D(_Illum, IN.uv_Illum).a; 35 o.Alpha = c.a; 36 } 37 ENDCG 38 39 Pass 40 { 41 CGINCLUDE 42 #include "UnityCG.cginc" 43 44 struct appdata { 45 float4 vertex : POSITION; 46 float3 normal : NORMAL; 47 }; 48 49 struct v2f { 50 float4 pos : POSITION; 51 float4 color : COLOR; 52 }; 53 54 uniform float _Outline; 55 uniform float4 _OutlineColor; 56 57 v2f vert(appdata v) { 58 v2f o; 59 o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 60 61 float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); 62 float2 offset = TransformViewToProjection(norm.xy); 63 64 o.pos.xy += offset * o.pos.z * _Outline; 65 o.color = _OutlineColor; 66 return o; 67 } 68 ENDCG 69 70 Name "OUTLINE" 71 Tags { "LightMode" = "Always" } 72 Cull Front 73 ZWrite On 74 ColorMask RGB 75 Blend SrcAlpha OneMinusSrcAlpha 76 77 CGPROGRAM 78 #pragma vertex vert 79 #pragma fragment frag 80 half4 frag(v2f i) :COLOR { return i.color; } 81 ENDCG 82 } 83 } 84 85 Fallback "Self-Illumin/VertexLit" 86 }