【URP】Unity3D物体遮罩的多种方案实现

【从UnityURP开始探索游戏渲染】专栏-直达

物体自身遮罩控制方案

基于Unity URP实现3D物体方向性动态遮罩

Shader核心功能‌:

  • 通过_MaskDirection向量定义遮罩方向
  • 使用_MaskProgress参数(0-1范围)控制显示比例
  • 基于顶点世界坐标在遮罩方向上的投影值进行裁剪(clip)
  • 兼容URP渲染管线标准结构

控制器特点‌:

  • 支持运行时动态调整遮罩方向和进度

  • 内置演示动画(旋转方向和进度波动)

  • 提供外部调用接口用于程序控制

  • 自动规范化方向向量确保计算准确

  • DirectionalMask.shader

    c 复制代码
    Shader "Custom/DirectionalMask"
    {
        Properties
        {
            _MainTex("Texture", 2D) = "white" {}
            _MaskDirection("Mask Direction", Vector) = (1,0,0,0)
            _MaskProgress("Mask Progress", Range(0, 1)) = 0.5
        }
    
        SubShader
        {
            Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
    
            HLSLINCLUDE
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    
            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };
    
            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv : TEXCOORD0;
                float3 positionWS : TEXCOORD1;
            };
    
            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);
            float4 _MainTex_ST;
            float3 _MaskDirection;
            float _MaskProgress;
    
            Varyings Vert(Attributes input)
            {
                Varyings output;
                output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                output.uv = TRANSFORM_TEX(input.uv, _MainTex);
                output.positionWS = TransformObjectToWorld(input.positionOS.xyz);
                return output;
            }
    
            half4 Frag(Varyings input) : SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
                
                // 计算物体顶点在遮罩方向上的投影比例
                float dotProduct = dot(normalize(input.positionWS), normalize(_MaskDirection));
                float normalizedDot = (dotProduct + 1) * 0.5; // 映射到0-1范围
                
                // 根据进度参数裁剪
                clip(normalizedDot - _MaskProgress);
                
                return col;
            }
            ENDHLSL
    
            Pass
            {
                HLSLPROGRAM
                #pragma vertex Vert
                #pragma fragment Frag
                ENDHLSL
            }
        }
    }
  • DirectionalMaskController.cs

    csharp 复制代码
    using UnityEngine;
    
    public class DirectionalMaskController : MonoBehaviour
    {
        [SerializeField] private Renderer _targetRenderer;
        [SerializeField] private Vector3 _maskDirection = Vector3.right;
        [Range(0, 1)] public float maskProgress = 0.5f;
        [SerializeField] private float _rotationSpeed = 30f;
        [SerializeField] private float _progressSpeed = 0.2f;
    
        private Material _material;
        private static readonly int MaskDirection = Shader.PropertyToID("_MaskDirection");
        private static readonly int MaskProgress = Shader.PropertyToID("_MaskProgress");
    
        void Start()
        {
            _material = _targetRenderer.material;
            UpdateShaderParams();
        }
    
        void Update()
        {
            // 动态旋转遮罩方向
            _maskDirection = Quaternion.Euler(0, _rotationSpeed * Time.deltaTime, 0) * _maskDirection;
            
            // 动态调整遮罩进度
            maskProgress = Mathf.PingPong(Time.time * _progressSpeed, 1f);
            
            UpdateShaderParams();
        }
    
        private void UpdateShaderParams()
        {
            _material.SetVector(MaskDirection, _maskDirection.normalized);
            _material.SetFloat(MaskProgress, maskProgress);
        }
    
        // 外部调用接口
        public void SetMaskDirection(Vector3 newDirection)
        {
            _maskDirection = newDirection.normalized;
            UpdateShaderParams();
        }
    
        public void SetMaskProgress(float progress)
        {
            maskProgress = Mathf.Clamp01(progress);
            UpdateShaderParams();
        }
    }

扩展

  • 可添加_MaskSharpness参数控制边缘过渡柔和度
  • 结合Stencil Buffer实现多物体遮罩叠加
  • 通过AnimationCurve控制进度变化曲线

该方案相比基础遮罩实现增加了方向向量参数和动态进度控制,通过顶点投影计算实现方向性裁剪效果。控制器脚本支持运行时动态调整所有参数,并保持与Shader的高效数据交互。

HLSL Shader实现‌(基于透明度遮罩):

  • unity_urp遮罩shader

    c 复制代码
    Shader "Custom/TransparentColorURP" {
        Properties {
            _Color("Color Tint", Color) = (1,1,1,1)
            _MainTex("Main Tex", 2D) = "white" {}
            _AlphaScale("Alpha Scale", Range(0, 1)) = 0.5
        }
        SubShader {
            Pass {
                ZWrite On
                ColorMask 0
            }
            Pass {
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha
                // HLSL代码...
            }
        }
    }

控制脚本‌:

  • unity_遮罩控制脚本

    csharp 复制代码
    public class MaskController : MonoBehaviour {
        public Renderer targetRenderer;
        public float maskProgress = 0.5f;
    
        void Update() {
            targetRenderer.material.SetFloat("_AlphaScale", 
                Mathf.PingPong(Time.time, 1f));
        }
    }

模板测试实现方案

模板Shader核心代码‌:

  • 创建一个四边形,将StencilMask做成材质赋给它。通过调整四边形的大小,来调整遮罩区域。

  • 当然也可在c#端动态调整mesh的点来做动态异形遮罩。

  • 将需要被遮罩的URP中Lit的物体,换成StencilLit的shader。这样原来的Lit的物体就支持StencilMask的遮罩了。

  • StencilMask.shader

    c 复制代码
    Shader "Custom/StencilMask"
    {
        SubShader
        {
            Tags { "RenderType"="Opaque" "Queue"="Geometry-100" }
            
            Pass
            {
                ColorMask 0
                ZWrite Off
                
                Stencil {
                    Ref 1
                    Comp Always
                    Pass Replace
                }
            }
        }
    }
  • StencilLit.shader

    c 复制代码
    Shader "Universal Render Pipeline/StencilLit"
    {
        Properties
        {
            // Specular vs Metallic workflow
            _WorkflowMode("WorkflowMode", Float) = 1.0
    
            [MainTexture] _BaseMap("Albedo", 2D) = "white" {}
            [MainColor] _BaseColor("Color", Color) = (1,1,1,1)
    
            _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
    
            _Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
            _SmoothnessTextureChannel("Smoothness texture channel", Float) = 0
    
            _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
            _MetallicGlossMap("Metallic", 2D) = "white" {}
    
            _SpecColor("Specular", Color) = (0.2, 0.2, 0.2)
            _SpecGlossMap("Specular", 2D) = "white" {}
    
            [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
            [ToggleOff] _EnvironmentReflections("Environment Reflections", Float) = 1.0
    
            _BumpScale("Scale", Float) = 1.0
            _BumpMap("Normal Map", 2D) = "bump" {}
    
            _Parallax("Scale", Range(0.005, 0.08)) = 0.005
            _ParallaxMap("Height Map", 2D) = "black" {}
    
            _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
            _OcclusionMap("Occlusion", 2D) = "white" {}
    
            [HDR] _EmissionColor("Color", Color) = (0,0,0)
            _EmissionMap("Emission", 2D) = "white" {}
    
            _DetailMask("Detail Mask", 2D) = "white" {}
            _DetailAlbedoMapScale("Scale", Range(0.0, 2.0)) = 1.0
            _DetailAlbedoMap("Detail Albedo x2", 2D) = "linearGrey" {}
            _DetailNormalMapScale("Scale", Range(0.0, 2.0)) = 1.0
            [Normal] _DetailNormalMap("Normal Map", 2D) = "bump" {}
    
            // SRP batching compatibility for Clear Coat (Not used in Lit)
            [HideInInspector] _ClearCoatMask("_ClearCoatMask", Float) = 0.0
            [HideInInspector] _ClearCoatSmoothness("_ClearCoatSmoothness", Float) = 0.0
    
            // Blending state
            _Surface("__surface", Float) = 0.0
            _Blend("__blend", Float) = 0.0
            _Cull("__cull", Float) = 2.0
            [ToggleUI] _AlphaClip("__clip", Float) = 0.0
            [HideInInspector] _SrcBlend("__src", Float) = 1.0
            [HideInInspector] _DstBlend("__dst", Float) = 0.0
            [HideInInspector] _SrcBlendAlpha("__srcA", Float) = 1.0
            [HideInInspector] _DstBlendAlpha("__dstA", Float) = 0.0
            [HideInInspector] _ZWrite("__zw", Float) = 1.0
            [HideInInspector] _BlendModePreserveSpecular("_BlendModePreserveSpecular", Float) = 1.0
            [HideInInspector] _AlphaToMask("__alphaToMask", Float) = 0.0
    
            [ToggleUI] _ReceiveShadows("Receive Shadows", Float) = 1.0
            // Editmode props
            _QueueOffset("Queue offset", Float) = 0.0
    
            // ObsoleteProperties
            [HideInInspector] _MainTex("BaseMap", 2D) = "white" {}
            [HideInInspector] _Color("Base Color", Color) = (1, 1, 1, 1)
            [HideInInspector] _GlossMapScale("Smoothness", Float) = 0.0
            [HideInInspector] _Glossiness("Smoothness", Float) = 0.0
            [HideInInspector] _GlossyReflections("EnvironmentReflections", Float) = 0.0
    
            [HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
            [HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
            [HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
        }
    
        SubShader
        {
            // Universal Pipeline tag is required. If Universal render pipeline is not set in the graphics settings
            // this Subshader will fail. One can add a subshader below or fallback to Standard built-in to make this
            // material work with both Universal Render Pipeline and Builtin Unity Pipeline
            Tags
            {
                "RenderType" = "Opaque"
                "RenderPipeline" = "UniversalPipeline"
                "UniversalMaterialType" = "Lit"
                "IgnoreProjector" = "True"
            }
            LOD 300
    
            // ------------------------------------------------------------------
            //  Forward pass. Shades all light in a single pass. GI + emission + Fog
            Pass
            {
                // Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
                // no LightMode tag are also rendered by Universal Render Pipeline
                Name "ForwardLit"
                Tags
                {
                    "LightMode" = "UniversalForward"
                }
    
                // -------------------------------------
                // Render State Commands
                Blend[_SrcBlend][_DstBlend], [_SrcBlendAlpha][_DstBlendAlpha]
                ZWrite[_ZWrite]
                Cull[_Cull]
                AlphaToMask[_AlphaToMask]
                Stencil {
                    Ref 1
                    Comp Equal
                    Pass Keep
                }
    
                HLSLPROGRAM
                #pragma target 2.0
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex LitPassVertex
                #pragma fragment LitPassFragment
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local _NORMALMAP
                #pragma shader_feature_local _PARALLAXMAP
                #pragma shader_feature_local _RECEIVE_SHADOWS_OFF
                #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
                #pragma shader_feature_local_fragment _SURFACE_TYPE_TRANSPARENT
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                #pragma shader_feature_local_fragment _ _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
                #pragma shader_feature_local_fragment _EMISSION
                #pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
                #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
                #pragma shader_feature_local_fragment _OCCLUSIONMAP
                #pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
                #pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
                #pragma shader_feature_local_fragment _SPECULAR_SETUP
    
                // -------------------------------------
                // Universal Pipeline keywords
                #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
                #pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
                #pragma multi_compile _ EVALUATE_SH_MIXED EVALUATE_SH_VERTEX
                #pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
                #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING
                #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION
                #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
                #pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION
                #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
                #pragma multi_compile_fragment _ _LIGHT_COOKIES
                #pragma multi_compile _ _LIGHT_LAYERS
                #pragma multi_compile _ _FORWARD_PLUS
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"
    
                // -------------------------------------
                // Unity defined keywords
                #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
                #pragma multi_compile _ SHADOWS_SHADOWMASK
                #pragma multi_compile _ DIRLIGHTMAP_COMBINED
                #pragma multi_compile _ LIGHTMAP_ON
                #pragma multi_compile _ DYNAMICLIGHTMAP_ON
                #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
                #pragma multi_compile_fog
                #pragma multi_compile_fragment _ DEBUG_DISPLAY
    
                //--------------------------------------
                // GPU Instancing
                #pragma multi_compile_instancing
                #pragma instancing_options renderinglayer
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitForwardPass.hlsl"
                ENDHLSL
            }
    
            Pass
            {
                Name "ShadowCaster"
                Tags
                {
                    "LightMode" = "ShadowCaster"
                }
    
                // -------------------------------------
                // Render State Commands
                ZWrite On
                ZTest LEqual
                ColorMask 0
                Cull[_Cull]
    
                HLSLPROGRAM
                #pragma target 2.0
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex ShadowPassVertex
                #pragma fragment ShadowPassFragment
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    
                //--------------------------------------
                // GPU Instancing
                #pragma multi_compile_instancing
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    
                // -------------------------------------
                // Universal Pipeline keywords
    
                // -------------------------------------
                // Unity defined keywords
                #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
    
                // This is used during shadow map generation to differentiate between directional and punctual light shadows, as they use different formulas to apply Normal Bias
                #pragma multi_compile_vertex _ _CASTING_PUNCTUAL_LIGHT_SHADOW
    
                // -------------------------------------
                // Includes
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
                ENDHLSL
            }
    
            Pass
            {
                // Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
                // no LightMode tag are also rendered by Universal Render Pipeline
                Name "GBuffer"
                Tags
                {
                    "LightMode" = "UniversalGBuffer"
                }
    
                // -------------------------------------
                // Render State Commands
                ZWrite[_ZWrite]
                ZTest LEqual
                Cull[_Cull]
    
                HLSLPROGRAM
                #pragma target 4.5
    
                // Deferred Rendering Path does not support the OpenGL-based graphics API:
                // Desktop OpenGL, OpenGL ES 3.0, WebGL 2.0.
                #pragma exclude_renderers gles3 glcore
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex LitGBufferPassVertex
                #pragma fragment LitGBufferPassFragment
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local _NORMALMAP
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                //#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
                #pragma shader_feature_local_fragment _EMISSION
                #pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
                #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
                #pragma shader_feature_local_fragment _OCCLUSIONMAP
                #pragma shader_feature_local _PARALLAXMAP
                #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
    
                #pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
                #pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
                #pragma shader_feature_local_fragment _SPECULAR_SETUP
                #pragma shader_feature_local _RECEIVE_SHADOWS_OFF
    
                // -------------------------------------
                // Universal Pipeline keywords
                #pragma multi_compile _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE _MAIN_LIGHT_SHADOWS_SCREEN
                //#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
                //#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
                #pragma multi_compile_fragment _ _REFLECTION_PROBE_BLENDING
                #pragma multi_compile_fragment _ _REFLECTION_PROBE_BOX_PROJECTION
                #pragma multi_compile_fragment _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH
                #pragma multi_compile_fragment _ _DBUFFER_MRT1 _DBUFFER_MRT2 _DBUFFER_MRT3
                #pragma multi_compile_fragment _ _RENDER_PASS_ENABLED
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"
    
                // -------------------------------------
                // Unity defined keywords
                #pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
                #pragma multi_compile _ SHADOWS_SHADOWMASK
                #pragma multi_compile _ DIRLIGHTMAP_COMBINED
                #pragma multi_compile _ LIGHTMAP_ON
                #pragma multi_compile _ DYNAMICLIGHTMAP_ON
                #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
                #pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT
    
                //--------------------------------------
                // GPU Instancing
                #pragma multi_compile_instancing
                #pragma instancing_options renderinglayer
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    
                // -------------------------------------
                // Includes
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitGBufferPass.hlsl"
                ENDHLSL
            }
    
            Pass
            {
                Name "DepthOnly"
                Tags
                {
                    "LightMode" = "DepthOnly"
                }
    
                // -------------------------------------
                // Render State Commands
                ZWrite On
                ColorMask R
                Cull[_Cull]
    
                HLSLPROGRAM
                #pragma target 2.0
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex DepthOnlyVertex
                #pragma fragment DepthOnlyFragment
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    
                // -------------------------------------
                // Unity defined keywords
                #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
    
                //--------------------------------------
                // GPU Instancing
                #pragma multi_compile_instancing
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    
                // -------------------------------------
                // Includes
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"
                ENDHLSL
            }
    
            // This pass is used when drawing to a _CameraNormalsTexture texture
            Pass
            {
                Name "DepthNormals"
                Tags
                {
                    "LightMode" = "DepthNormals"
                }
    
                // -------------------------------------
                // Render State Commands
                ZWrite On
                Cull[_Cull]
    
                HLSLPROGRAM
                #pragma target 2.0
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex DepthNormalsVertex
                #pragma fragment DepthNormalsFragment
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local _NORMALMAP
                #pragma shader_feature_local _PARALLAXMAP
                #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                #pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
    
                // -------------------------------------
                // Unity defined keywords
                #pragma multi_compile_fragment _ LOD_FADE_CROSSFADE
    
                // -------------------------------------
                // Universal Pipeline keywords
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/RenderingLayers.hlsl"
    
                //--------------------------------------
                // GPU Instancing
                #pragma multi_compile_instancing
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    
                // -------------------------------------
                // Includes
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitDepthNormalsPass.hlsl"
                ENDHLSL
            }
    
            // This pass it not used during regular rendering, only for lightmap baking.
            Pass
            {
                Name "Meta"
                Tags
                {
                    "LightMode" = "Meta"
                }
    
                // -------------------------------------
                // Render State Commands
                Cull Off
    
                HLSLPROGRAM
                #pragma target 2.0
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex UniversalVertexMeta
                #pragma fragment UniversalFragmentMetaLit
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local_fragment _SPECULAR_SETUP
                #pragma shader_feature_local_fragment _EMISSION
                #pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                #pragma shader_feature_local_fragment _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
                #pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
                #pragma shader_feature_local_fragment _SPECGLOSSMAP
                #pragma shader_feature EDITOR_VISUALIZATION
    
                // -------------------------------------
                // Includes
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitMetaPass.hlsl"
    
                ENDHLSL
            }
    
            Pass
            {
                Name "Universal2D"
                Tags
                {
                    "LightMode" = "Universal2D"
                }
    
                // -------------------------------------
                // Render State Commands
                Blend[_SrcBlend][_DstBlend]
                ZWrite[_ZWrite]
                Cull[_Cull]
    
                HLSLPROGRAM
                #pragma target 2.0
    
                // -------------------------------------
                // Shader Stages
                #pragma vertex vert
                #pragma fragment frag
    
                // -------------------------------------
                // Material Keywords
                #pragma shader_feature_local_fragment _ALPHATEST_ON
                #pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
    
                #include_with_pragmas "Packages/com.unity.render-pipelines.universal/ShaderLibrary/DOTS.hlsl"
    
                // -------------------------------------
                // Includes
                #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
                #include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/Universal2D.hlsl"
                ENDHLSL
            }
        }
    
        FallBack "Hidden/Universal Render Pipeline/FallbackError"
        CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.LitShader"
    }

RenderFeature配置要点‌:

  • 需创建URP Renderer Feature
  • 设置Layer Mask匹配目标层级
  • 在后处理前添加Pass

三、其他实现方式

多Pass深度测试法‌:

c 复制代码
Pass {
    ZTest Greater
    ZWrite On
    ColorMask 0
}
Pass {
    ZTest LEqual
    // 正常渲染...
}

UGUI Mask混合方案‌:

  • 使用RectTransform确定遮罩区域
  • 通过第二摄像机渲染3D物体
  • 结合UI Mask组件控制显示范围

RenderTexture遮罩‌:

  • 创建临时RenderTexture
  • 使用特定Shader渲染遮罩通道
  • 通过后期处理合成最终效果

四、方案对比

方案类型 优点 适用场景
模板测试 高性能,精确控制 角色轮廓/固定形状遮罩
多Pass 无需额外纹理 简单遮挡提示
UGUI混合 可结合UI系统 HUD元素遮罩
RenderTexture 效果最灵活 复杂动态遮罩

模板测试适合需要精确控制像素级显示的场景,而多Pass方案更适合简单的遮挡提示效果


【从UnityURP开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

相关推荐
Xeon_CC15 小时前
Unity中,软遮罩SoftMaskForUGUI可移动遮罩形状实现方法
unity·游戏引擎
Yasin Chen17 小时前
Unity Standard Shader 解析(五)之ShadowCaster
unity·游戏引擎
我想_iwant1 天前
android集成unity后动态导入 assetsBundle
android·unity·游戏引擎
EQ-雪梨蛋花汤1 天前
【踩坑记录】Unity 项目中 PlasticSCM 掩蔽列表引发的 文件缺失问题排查与解决
unity·游戏引擎
Thinbug1 天前
Unity 枪械红点瞄准器计算
unity·游戏引擎
我想_iwant1 天前
unity中的交互控制脚本
数码相机·unity·交互
龚子亦1 天前
【Unity开发】热更新学习——AssetBundle
学习·unity·游戏引擎
萘柰奈1 天前
Unity学习----【数据持久化】二进制数据(五)--由Excel自动生成数据结构类与二进制文件
数据结构·学习·unity
心前阳光1 天前
Unity通过Object学习原型模式
学习·unity·原型模式