> 技术文档 > 【URP】Unity 3D物体遮罩的多种方案实现

【URP】Unity 3D物体遮罩的多种方案实现


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

物体自身遮罩控制方案

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

Shader核心功能‌:

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

控制器特点‌:

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

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

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

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

  • DirectionalMask.shader

    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

    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

    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_遮罩控制脚本

    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

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

    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深度测试法‌:

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开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

四川饮食文化