Shader "UI/EyeViewportOverlay" { Properties { [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} _Color ("Tint", Color) = (0, 0, 0, 1) [Header(Eye Opening)] _EyeWidth ("Eye Width", Range(0.22, 0.58)) = 0.46 _EyeHeight ("Eye Height", Range(0.15, 0.72)) = 0.28 _EdgeSoftness ("Edge Softness", Range(0.001, 0.2)) = 0.022 _BlinkOpen ("Blink Open", Range(0, 1)) = 1 _StencilComp ("Stencil Comparison", Float) = 8 _Stencil ("Stencil ID", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0 _StencilWriteMask ("Stencil Write Mask", Float) = 255 _StencilReadMask ("Stencil Read Mask", Float) = 255 _ColorMask ("Color Mask", Float) = 15 } SubShader { Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" } Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } Cull Off Lighting Off ZWrite Off ZTest [unity_GUIZTestMode] Blend SrcAlpha OneMinusSrcAlpha ColorMask [_ColorMask] Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #include "UnityCG.cginc" #include "UnityUI.cginc" struct appdata { float4 vertex : POSITION; float4 color : COLOR; float2 uv : TEXCOORD0; }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 uv : TEXCOORD0; float4 worldPosition : TEXCOORD1; float4 screenPosition : TEXCOORD2; }; sampler2D _MainTex; fixed4 _Color; float4 _ClipRect; float _EyeWidth; float _EyeHeight; float _EdgeSoftness; float _BlinkOpen; v2f vert(appdata v) { v2f o; o.worldPosition = v.vertex; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.screenPosition = ComputeScreenPos(o.vertex); o.color = v.color * _Color; return o; } float FeatherBoundaryAlpha(float insideHard, float edgeDist, float softness) { float outside = 1.0 - insideHard; float edgeFeather = (1.0 - smoothstep(0.0, softness, edgeDist)) * insideHard; return saturate(outside + edgeFeather); } float ComputeViewportAlpha(float2 uv) { float2 c = uv - 0.5; float softness = max(0.001, _EdgeSoftness); float blinkOpen = saturate(_BlinkOpen); if (blinkOpen <= 0.001) { return 1.0; } float rx = max(_EyeWidth, 0.001); float ry = max(_EyeHeight * blinkOpen, 0.001); float ellipseDist = length(float2(c.x / rx, c.y / ry)); float insideHard = 1.0 - step(1.0, ellipseDist); float edgeDist = (1.0 - ellipseDist) * insideHard; return FeatherBoundaryAlpha(insideHard, edgeDist, softness); } fixed4 frag(v2f i) : SV_Target { float2 screenUv = i.screenPosition.xy / max(i.screenPosition.w, 0.0001); float alpha = ComputeViewportAlpha(saturate(screenUv)); fixed4 col = fixed4(i.color.rgb, i.color.a * alpha); col.a *= UnityGet2DClipping(i.worldPosition.xy, _ClipRect); return col; } ENDCG } } Fallback Off }