Files
aibis-dream/Assets/Render/EyeViewportOverlay.shader

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
}