135 lines
4.0 KiB
Plaintext
135 lines
4.0 KiB
Plaintext
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
|
|
}
|