| New file |
| | |
| | | Shader "GUI/EllipseMask" |
| | | { |
| | | Properties |
| | | { |
| | | [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {} |
| | | _Color ("Tint", Color) = (1,1,1,1) |
| | | |
| | | [Header(Ellipse Settings)] |
| | | _EllipseCenter ("Ellipse Center", Vector) = (0.5, 0.5, 0, 0) |
| | | _EllipseRadius ("Ellipse Radius", Vector) = (0.5, 0.5, 0, 0) |
| | | _Softness ("Softness", Range(0, 0.5)) = 0.1 |
| | | |
| | | [Header(Stencil Settings)] |
| | | _StencilComp ("Stencil Comparison", Float) = 8 |
| | | _Stencil ("Stencil ID", Float) = 1 |
| | | _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" |
| | | } |
| | | |
| | | // 椭圆形遮罩写入Pass |
| | | Pass |
| | | { |
| | | Name "Ellipse Mask Write" |
| | | |
| | | Stencil |
| | | { |
| | | Ref [_Stencil] |
| | | Comp Always |
| | | Pass Replace |
| | | ReadMask [_StencilReadMask] |
| | | WriteMask [_StencilWriteMask] |
| | | } |
| | | |
| | | ColorMask 0 // 不写入颜色,只写入模板 |
| | | ZWrite Off |
| | | Cull Off |
| | | Blend Off |
| | | |
| | | CGPROGRAM |
| | | #pragma vertex vert |
| | | #pragma fragment frag |
| | | #include "UnityCG.cginc" |
| | | |
| | | struct appdata_t |
| | | { |
| | | float4 vertex : POSITION; |
| | | float2 texcoord : TEXCOORD0; |
| | | }; |
| | | |
| | | struct v2f |
| | | { |
| | | float4 vertex : SV_POSITION; |
| | | float2 texcoord : TEXCOORD0; |
| | | }; |
| | | |
| | | sampler2D _MainTex; |
| | | float4 _MainTex_ST; |
| | | float4 _EllipseCenter; |
| | | float4 _EllipseRadius; |
| | | float _Softness; |
| | | |
| | | v2f vert(appdata_t v) |
| | | { |
| | | v2f o; |
| | | o.vertex = UnityObjectToClipPos(v.vertex); |
| | | o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); |
| | | return o; |
| | | } |
| | | |
| | | fixed4 frag(v2f i) : SV_Target |
| | | { |
| | | // 计算到椭圆中心的距离(归一化坐标) |
| | | float2 center = _EllipseCenter.xy; |
| | | float2 radius = _EllipseRadius.xy; |
| | | |
| | | // 椭圆方程:(x-center.x)^2/radius.x^2 + (y-center.y)^2/radius.y^2 <= 1 |
| | | float2 pos = i.texcoord; |
| | | float dx = (pos.x - center.x) / radius.x; |
| | | float dy = (pos.y - center.y) / radius.y; |
| | | float ellipseValue = dx * dx + dy * dy; |
| | | |
| | | // 软边缘处理 - 调整椭圆边界 |
| | | float adjustedEllipseValue = ellipseValue; |
| | | if (_Softness > 0) |
| | | { |
| | | // 使用smoothstep创建软边缘过渡 |
| | | adjustedEllipseValue = smoothstep(1.0 - _Softness, 1.0 + _Softness, ellipseValue); |
| | | } |
| | | |
| | | // 如果不在椭圆内,则丢弃像素 |
| | | clip(1.0 - adjustedEllipseValue - 0.01); |
| | | return fixed4(0, 0, 0, 0); |
| | | } |
| | | ENDCG |
| | | } |
| | | |
| | | // 正常渲染Pass - 只在模板匹配的区域渲染 |
| | | Pass |
| | | { |
| | | Name "Masked Content" |
| | | |
| | | Stencil |
| | | { |
| | | Ref [_Stencil] |
| | | Comp Equal |
| | | Pass Keep |
| | | ReadMask [_StencilReadMask] |
| | | WriteMask [_StencilWriteMask] |
| | | } |
| | | |
| | | Blend SrcAlpha OneMinusSrcAlpha |
| | | ColorMask [_ColorMask] |
| | | ZWrite Off |
| | | Cull Off |
| | | |
| | | CGPROGRAM |
| | | #pragma vertex vert |
| | | #pragma fragment frag |
| | | #include "UnityCG.cginc" |
| | | |
| | | struct appdata_t |
| | | { |
| | | float4 vertex : POSITION; |
| | | float4 color : COLOR; |
| | | float2 texcoord : TEXCOORD0; |
| | | }; |
| | | |
| | | struct v2f |
| | | { |
| | | float4 vertex : SV_POSITION; |
| | | fixed4 color : COLOR; |
| | | float2 texcoord : TEXCOORD0; |
| | | }; |
| | | |
| | | sampler2D _MainTex; |
| | | float4 _MainTex_ST; |
| | | fixed4 _Color; |
| | | |
| | | v2f vert(appdata_t v) |
| | | { |
| | | v2f o; |
| | | o.vertex = UnityObjectToClipPos(v.vertex); |
| | | o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); |
| | | o.color = v.color * _Color; |
| | | return o; |
| | | } |
| | | |
| | | fixed4 frag(v2f i) : SV_Target |
| | | { |
| | | fixed4 color = tex2D(_MainTex, i.texcoord) * i.color; |
| | | return color; |
| | | } |
| | | ENDCG |
| | | } |
| | | } |
| | | } |