You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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自定义渲染通道(批量处理)

适合需要批量控制多个物体的场景:

  1. 在Project窗口创建HDRP Custom Pass Volume并添加到场景
  2. 创建如下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);
    }
}
  1. 将需要仅显示阴影的物体放到指定Layer,在Custom Pass Volume中添加该脚本并设置目标Layer

注意事项

  • 确保目标物体的Mesh RendererCast Shadows设为On,Receive Shadows可根据需求调整
  • 使用透明材质方法时,不要关闭ZWrite,否则会导致阴影计算异常
  • 自定义Shader时,需确保已正确导入HDRP的HLSL库,避免编译错误

内容的提问来源于stack exchange,提问作者Nevena Milenković

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 09:47:35