Unity HDRP中如何仅显示网格的阴影?
在HDRP中实现“仅阴影(Shadows Only)”效果的解决方案
方法一:利用HDRP自带材质快速实现
- 创建一个HDRP Lit材质,进入Surface Options面板
- 将Surface Type设为
Transparent,开启Alpha Clipping并把Threshold拉到最大值1(让材质完全透明) - 切换到Advanced Options,将Render Queue设置为
AlphaTest(或手动输入2450,确保处于不透明与透明队列之间,保证阴影通道正常工作) - 给目标Mesh Renderer挂载该材质,同时确保其Cast Shadows设为
On,Receive Shadows可按需关闭(若无需接收阴影)
方法二:自定义HDRP Shader(精准控制)
如果之前自定义Shader失败,大概率是未正确处理HDRP的阴影投射通道,以下是简化版可直接使用的Shader代码:
Shader "Custom/HDRP_ShadowsOnly" { Properties {} SubShader { Tags { "RenderType"="Opaque" "RenderPipeline"="HDRenderPipeline" } LOD 100 // 主通道:仅写入深度,不输出任何像素颜色 Pass { Name "ForwardUnlit" ZWrite On ColorMask 0 HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/RenderPass/CustomPass/CustomPassCommon.hlsl" struct Attributes { float4 positionOS : POSITION; }; struct Varyings { float4 positionHCS : SV_POSITION; }; Varyings vert(Attributes input) { Varyings output; output.positionHCS = TransformObjectToHClip(input.positionOS.xyz); return output; } half4 frag(Varyings input) : SV_Target { return half4(0,0,0,0); } ENDHLSL } // 复用HDRP内置的阴影投射通道,确保阴影正常生成 UsePass "HDRP/Lit/SHADOWCASTER" } }
- 给目标物体挂载该Shader的材质,开启Mesh Renderer的Cast Shadows即可生效
方法三:使用HDRP自定义渲染通道(批量处理)
适合需要批量控制多个物体的场景:
- 在Project窗口创建HDRP Custom Pass Volume并添加到场景
- 创建如下Custom Pass脚本:
using UnityEngine; using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering; public class ShadowsOnlyPass : CustomPass { public LayerMask targetLayer; protected override void Execute(ScriptableRenderContext renderContext, CommandBuffer cmd, HDCamera camera, CullingResults cullingResult) { var filterSettings = new FilteringSettings(RenderQueueRange.all, targetLayer); var drawSettings = CreateDrawingSettings(new ShaderTagId("Forward"), camera, SortingCriteria.CommonOpaque); drawSettings.enableDynamicBatching = true; // 仅渲染物体的阴影投射通道,跳过主渲染 drawSettings.SetShaderPassName(0, new ShaderTagId("ShadowCaster")); renderContext.DrawRenderers(cullingResult, ref drawSettings, ref filterSettings); } }
- 将需要仅显示阴影的物体放到指定Layer,在Custom Pass Volume中添加该脚本并设置目标Layer
注意事项
- 确保目标物体的Mesh RendererCast Shadows设为
On,Receive Shadows可根据需求调整 - 使用透明材质方法时,不要关闭
ZWrite,否则会导致阴影计算异常 - 自定义Shader时,需确保已正确导入HDRP的HLSL库,避免编译错误
内容的提问来源于stack exchange,提问作者Nevena Milenković
相关产品推荐
相关产品推荐

