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

【从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开始探索游戏渲染】专栏-直达

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

发表评论

评论已关闭。

相关文章