Advertisement
Guest User

Stencil Outline Effect

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