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

Unity:如何让相机渲染被自身剔除但未被灯光剔除对象的阴影?

解决方案

嘿,这个问题我之前做类似《模拟人生》风格的场景时也踩过坑!Unity默认渲染管线里,相机的剔除遮罩确实会连带影响阴影生成——哪怕灯光的遮罩包含目标对象,只要相机把它剔除了,它的阴影也会跟着消失。不过有几个实用的解决办法,你可以根据自己的渲染管线来选:

方法1:自定义Shader实现“仅阴影”渲染(适合内置管线)

给walls层的墙壁对象做一个专属Shader,让它只生成阴影但不被相机看到:

  • 在Shader里添加ColorMask 0,这样对象不会输出任何颜色,相机就看不到它了
  • 保留阴影投射的Pass(比如内置管线里的ShadowCaster Pass),确保灯光能正常生成它的阴影
  • 切换墙壁状态时:
    • 要显示完整墙壁:给walls层对象用默认Shader,同时相机剔除shortWalls层
    • 要显示短墙:给walls层对象切换到这个仅阴影的Shader,同时相机剔除walls层、显示shortWalls层

方法2:用“阴影专用相机”(适合所有管线)

创建一个只负责渲染阴影的辅助相机:

  • 新建一个相机,把它的culling mask设置成和灯光一致(也就是包含walls层、剔除shortWalls层)
  • 关闭这个相机的画面输出:可以给它指定一个空的RenderTexture,或者直接把相机的Clear Flags设为Nothing、Depth设为比主相机低很多的数值,确保它不会干扰主相机的画面
  • 在Quality Settings里调整阴影的来源,让灯光使用这个辅助相机的阴影计算结果
  • 这样主相机剔除walls层时,辅助相机依然会让walls层生成阴影,灯光也能正常投射这些阴影到场景里

方法3:URP/HDRP管线的分层渲染(最简洁)

如果你用的是通用渲染管线(URP)或高清渲染管线(HDRP),可以直接利用管线的分层功能:

  • 在管线配置里创建一个自定义的Render Layer,把walls层标记为仅参与阴影渲染
  • 配置主相机的渲染层,排除walls层(让相机看不到它)
  • 配置灯光的阴影层,包含walls层(让灯光计算它的阴影)
  • 这种方法不需要额外的相机或Shader修改,是最省心的方案

内容的提问来源于stack exchange,提问作者juanferrer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:24:32