hwj35
3 天以前 5ca0ad17d264f3626fc40db21b8ec225621b9a1d
Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_resourcesout
4个文件已添加
276 ■■■■■ 已修改文件
Shader/GUI_EllipseMask.shader 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Shader/GUI_EllipseMask.shader.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Shader/GUI_EllipseMaskedContent.shader 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Shader/GUI_EllipseMaskedContent.shader.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Shader/GUI_EllipseMask.shader
New file
@@ -0,0 +1,170 @@
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
        }
    }
}
Shader/GUI_EllipseMask.shader.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 615283f6a08d3b84da1c669ff74c6b8f
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName:
  assetBundleVariant:
Shader/GUI_EllipseMaskedContent.shader
New file
@@ -0,0 +1,88 @@
Shader "GUI/EllipseMaskedContent"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)
        [Header(Stencil Settings)]
        _StencilComp ("Stencil Comparison", Float) = 3  // Equal
        _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
        {
            Name "Masked Content"
            Stencil
            {
                Ref [_Stencil]
                Comp [_StencilComp]  // 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
        }
    }
}
Shader/GUI_EllipseMaskedContent.shader.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 6f9974c191afb7d419c9a918cd2bf7cb
ShaderImporter:
  externalObjects: {}
  defaultTextures: []
  nonModifiableTextures: []
  userData:
  assetBundleName:
  assetBundleVariant: