// Copyright © 2020 Leviant. // E-mail: leviant@yandex.ru // Discord: Leviant#8796 // My Discord server: https://discord.gg/MdykFMf // Patreon: https://www.patreon.com/Leviant // License: http://opensource.org/licenses/MIT // Version: 1.0 (03.05.2020) Shader "Leviant's Shaders/Sketch" { Properties { _Color("Color", Color) = (0, 0, 0, 1) _OutlineColor("Outline Color", Color) = (1, 1, 1, 0.1) _Outline("Outline width", Float) = 0.002 _FrameRate("Framerate", Float) = 8 [Enum(Transparent, 0, Opaque, 14)]_Mask("Surface", Int) = 14 } CGINCLUDE #include "UnityCG.cginc" #define LAYERS 4 uniform float4 _Color; uniform float4 _OutlineColor; uniform float _Outline; uniform float _FrameRate; struct appdata { float3 vertex : POSITION; uint vertexID : SV_VertexID; }; struct v2g { float3 worldPos : TEXCOORD0; float vertexID : TEXCOORD1; }; struct g2f { float4 vertex : SV_POSITION; UNITY_FOG_COORDS(0) }; float3 R2(float n) { const float g = 1.22074408460575947536; const float3 a = 1.0 / float3(g, g * g, g * g * g); return frac(a * n.xxx) * 2 - 1; } ENDCG SubShader { Tags{ "RenderType" = "Transparent" "Queue" = "Transparent"} Pass { ColorMask [_Mask] CGPROGRAM #pragma target 5.0 #pragma vertex vert #pragma fragment frag float4 vert(float3 vertex : POSITION) : SV_POSITION { return UnityObjectToClipPos(vertex); } float4 frag() : SV_Target { return _Color; } ENDCG } Pass { Blend SrcAlpha OneMinusSrcAlpha ZWrite Off Cull Front CGPROGRAM #pragma target 5.0 #pragma vertex vert #pragma geometry geom #pragma fragment frag #pragma multi_compile_fog v2g vert (appdata v) { v2g o; o.worldPos = mul(unity_ObjectToWorld, float4(v.vertex, 1.0)); o.vertexID = LAYERS * floor(v.vertexID + _Time.y * _FrameRate); return o; } [maxvertexcount(LAYERS * 3)] void geom(triangle v2g IN[3], inout TriangleStream tristream) { g2f o; UNITY_UNROLL for (float t = 0; t < LAYERS; t += 1.0) { UNITY_UNROLL for (int i = 0; i < 3; i++) { o.vertex = UnityWorldToClipPos(IN[i].worldPos); o.vertex.xyw += (o.vertex.w + 2.0) * R2(IN[i].vertexID + t) * _Outline; UNITY_TRANSFER_FOG(o, o.vertex); tristream.Append(o); } tristream.RestartStrip(); } } float4 frag (g2f i) : SV_Target { float4 color = _OutlineColor; UNITY_APPLY_FOG(i.fogCoord, color); return color; } ENDCG } } }