Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
- Shader "Outline"
- {
- Properties
- {
- _Color("Color", Color) = (1,0,0,1)
- _Thickness("Thickness", float) = 4
- _NoiseTex("Noise Map", 2D) = "white" {}
- _FadeDist("Fade Distance", Range(0, 500)) = 100
- _MinDist("Minimum Fade In Distace", Range(0,25)) = 10
- }
- SubShader
- {
- Tags{ "Queue" = "Transparent+1" "IgnoreProjector" = "True" "RenderType" = "Transparent" "DisableBatching" = "True" }
- Blend SrcAlpha One
- Cull Back
- ZTest always
- Pass
- {
- Stencil
- {
- Ref 1
- Comp always
- Pass replace
- }
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_fog
- #include "UnityCG.cginc"
- struct v2g
- {
- float4 pos : SV_POSITION;
- float2 uv : TEXCOORD0;
- float3 viewTangent : TANGENT;
- float3 normals : NORMAL;
- };
- struct g2f
- {
- float4 pos : SV_POSITION;
- float2 uv : TEXCOORD0;
- float3 viewTangent : TANGENT;
- float3 normals : NORMAL;
- };
- v2g vert(appdata_base v)
- {
- v2g OUT;
- OUT.pos = UnityObjectToClipPos(v.vertex);
- OUT.uv = v.texcoord;
- OUT.normals = v.normal;
- OUT.viewTangent = ObjSpaceViewDir(v.vertex);
- return OUT;
- }
- half4 frag(g2f IN) : COLOR
- {
- //Render nothing, since this shader is for a secondary material
- return 0;
- }
- ENDCG
- }
- Pass
- {
- Stencil
- {
- Ref 0
- Comp equal
- }
- CGPROGRAM
- #include "UnityCG.cginc"
- #pragma target 3.0
- #pragma vertex vert
- #pragma require geometry
- #pragma geometry geom
- #pragma fragment frag
- half4 _Color;
- float _Thickness;
- sampler2D _NoiseTex;
- float _FadeDist;
- float _MinDist;
- struct v2g
- {
- float4 pos : SV_POSITION;
- float2 uv : TEXCOORD0;
- float3 viewTangent : TANGENT;
- float3 normals : NORMAL;
- float3 viewDist : TEXCOORD1;
- };
- struct g2f
- {
- float4 pos : SV_POSITION;
- float2 uv : TEXCOORD0;
- float3 viewTangent : TANGENT;
- float3 normals : NORMAL;
- float3 viewDist : TEXCOORD1;
- };
- v2g vert(appdata_base v)
- {
- v2g OUT;
- OUT.pos = UnityObjectToClipPos(v.vertex);
- OUT.uv = v.texcoord;
- OUT.normals = v.normal;
- OUT.viewTangent = ObjSpaceViewDir(v.vertex);
- OUT.viewDist = UnityObjectToViewPos(v.vertex).xyz;
- return OUT;
- }
- void displaceGeo(v2g start, v2g end, inout TriangleStream<g2f> triStream)
- {
- float width = _Thickness / 100;
- float4 parallel = end.pos - start.pos;
- normalize(parallel);
- parallel *= width;
- float4 perpendicular = float4(parallel.y, -parallel.x, 0, 0);
- perpendicular = normalize(perpendicular) * width;
- float4 v1 = start.pos - parallel;
- float4 v2 = end.pos + parallel;
- g2f OUT;
- OUT.pos = v1 - perpendicular;
- OUT.uv = start.uv;
- OUT.viewTangent = start.viewTangent;
- OUT.normals = start.normals;
- OUT.viewDist = start.viewDist;
- triStream.Append(OUT);
- OUT.pos = v1 + perpendicular;
- OUT.viewDist = start.viewDist;
- triStream.Append(OUT);
- OUT.pos = v2 - perpendicular;
- OUT.uv = end.uv;
- OUT.viewTangent = end.viewTangent;
- OUT.normals = end.normals;
- OUT.viewDist = start.viewDist;
- triStream.Append(OUT);
- OUT.pos = v2 + perpendicular;
- OUT.uv = end.uv;
- OUT.viewTangent = end.viewTangent;
- OUT.normals = end.normals;
- OUT.viewDist = start.viewDist;
- triStream.Append(OUT);
- }
- [maxvertexcount(4)]
- void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream)
- {
- displaceGeo(IN[0],IN[1], triStream);
- displaceGeo(IN[1],IN[2], triStream);
- displaceGeo(IN[2],IN[0], triStream);
- }
- half4 frag(g2f IN) : COLOR
- {
- IN.uv.x += _Time;
- IN.uv.y += _Time;
- fixed4 col = tex2D(_NoiseTex, IN.uv) * _Color;
- col.a = saturate((length(IN.viewDist) - _MinDist) / _FadeDist);
- clip(col.a - 0.001);
- return col;
- }
- ENDCG
- }
- }
- FallBack "Diffuse"
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement