Advertisement
Guest User

Stencil Outline Effect

a guest
Apr 24th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.74 KB | None | 0 0
  1. // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
  2.  
  3. Shader "Outline"
  4. {
  5. Properties
  6. {
  7. _Color("Color", Color) = (1,0,0,1)
  8. _Thickness("Thickness", float) = 4
  9. _NoiseTex("Noise Map", 2D) = "white" {}
  10. _FadeDist("Fade Distance", Range(0, 500)) = 100
  11. _MinDist("Minimum Fade In Distace", Range(0,25)) = 10
  12. }
  13. SubShader
  14. {
  15.  
  16. Tags{ "Queue" = "Transparent+1" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True" }
  17. Blend SrcAlpha One
  18. Cull Back
  19. ZTest always
  20. Pass
  21. {
  22. Stencil
  23. {
  24. Ref 1
  25. Comp always
  26. Pass replace
  27. }
  28.  
  29. CGPROGRAM
  30. #pragma vertex vert
  31. #pragma fragment frag
  32. #pragma multi_compile_fog
  33.  
  34. #include "UnityCG.cginc"
  35.  
  36. struct v2g
  37. {
  38. float4 pos : SV_POSITION;
  39. float2 uv : TEXCOORD0;
  40. float3 viewTangent : TANGENT;
  41. float3 normals : NORMAL;
  42. };
  43.  
  44. struct g2f
  45. {
  46. float4 pos : SV_POSITION;
  47. float2 uv : TEXCOORD0;
  48. float3 viewTangent : TANGENT;
  49. float3 normals : NORMAL;
  50. };
  51.  
  52. v2g vert(appdata_base v)
  53. {
  54. v2g OUT;
  55. OUT.pos = UnityObjectToClipPos(v.vertex);
  56. OUT.uv = v.texcoord;
  57. OUT.normals = v.normal;
  58. OUT.viewTangent = ObjSpaceViewDir(v.vertex);
  59.  
  60. return OUT;
  61. }
  62.  
  63. half4 frag(g2f IN) : COLOR
  64. {
  65. //Render nothing, since this shader is for a secondary material
  66. return 0;
  67. }
  68. ENDCG
  69. }
  70. Pass
  71. {
  72. Stencil
  73. {
  74. Ref 0
  75. Comp equal
  76. }
  77. CGPROGRAM
  78. #include "UnityCG.cginc"
  79. #pragma target 3.0
  80. #pragma vertex vert
  81. #pragma require geometry
  82. #pragma geometry geom
  83. #pragma fragment frag
  84.  
  85.  
  86. half4 _Color;
  87. float _Thickness;
  88. sampler2D _NoiseTex;
  89. float _FadeDist;
  90. float _MinDist;
  91. struct v2g
  92. {
  93. float4 pos : SV_POSITION;
  94. float2 uv : TEXCOORD0;
  95. float3 viewTangent : TANGENT;
  96. float3 normals : NORMAL;
  97. float3 viewDist : TEXCOORD1;
  98. };
  99. struct g2f
  100. {
  101. float4 pos : SV_POSITION;
  102. float2 uv : TEXCOORD0;
  103. float3 viewTangent : TANGENT;
  104. float3 normals : NORMAL;
  105. float3 viewDist : TEXCOORD1;
  106. };
  107.  
  108. v2g vert(appdata_base v)
  109. {
  110. v2g OUT;
  111. OUT.pos = UnityObjectToClipPos(v.vertex);
  112. OUT.uv = v.texcoord;
  113. OUT.normals = v.normal;
  114. OUT.viewTangent = ObjSpaceViewDir(v.vertex);
  115. OUT.viewDist = UnityObjectToViewPos(v.vertex).xyz;
  116. return OUT;
  117. }
  118.  
  119. void displaceGeo(v2g start, v2g end, inout TriangleStream<g2f> triStream)
  120. {
  121. float width = _Thickness / 100;
  122. float4 parallel = end.pos - start.pos;
  123. normalize(parallel);
  124. parallel *= width;
  125.  
  126. float4 perpendicular = float4(parallel.y, -parallel.x, 0, 0);
  127. perpendicular = normalize(perpendicular) * width;
  128. float4 v1 = start.pos - parallel;
  129. float4 v2 = end.pos + parallel;
  130.  
  131. g2f OUT;
  132.  
  133. OUT.pos = v1 - perpendicular;
  134. OUT.uv = start.uv;
  135. OUT.viewTangent = start.viewTangent;
  136. OUT.normals = start.normals;
  137. OUT.viewDist = start.viewDist;
  138. triStream.Append(OUT);
  139.  
  140. OUT.pos = v1 + perpendicular;
  141. OUT.viewDist = start.viewDist;
  142. triStream.Append(OUT);
  143.  
  144. OUT.pos = v2 - perpendicular;
  145. OUT.uv = end.uv;
  146. OUT.viewTangent = end.viewTangent;
  147. OUT.normals = end.normals;
  148. OUT.viewDist = start.viewDist;
  149. triStream.Append(OUT);
  150.  
  151. OUT.pos = v2 + perpendicular;
  152. OUT.uv = end.uv;
  153. OUT.viewTangent = end.viewTangent;
  154. OUT.normals = end.normals;
  155. OUT.viewDist = start.viewDist;
  156. triStream.Append(OUT);
  157. }
  158.  
  159. [maxvertexcount(4)]
  160. void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream)
  161. {
  162. displaceGeo(IN[0],IN[1], triStream);
  163. displaceGeo(IN[1],IN[2], triStream);
  164. displaceGeo(IN[2],IN[0], triStream);
  165. }
  166.  
  167. half4 frag(g2f IN) : COLOR
  168. {
  169. IN.uv.x += _Time;
  170. IN.uv.y += _Time;
  171. fixed4 col = tex2D(_NoiseTex, IN.uv) * _Color;
  172. col.a = saturate((length(IN.viewDist) - _MinDist) / _FadeDist);
  173. clip(col.a - 0.001);
  174. return col;
  175. }
  176. ENDCG
  177. }
  178. }
  179. FallBack "Diffuse"
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement