Unity:如何让相机渲染被自身剔除但未被灯光剔除对象的阴影?
解决方案
嘿,这个问题我之前做类似《模拟人生》风格的场景时也踩过坑!Unity默认渲染管线里,相机的剔除遮罩确实会连带影响阴影生成——哪怕灯光的遮罩包含目标对象,只要相机把它剔除了,它的阴影也会跟着消失。不过有几个实用的解决办法,你可以根据自己的渲染管线来选:
方法1:自定义Shader实现“仅阴影”渲染(适合内置管线)
给walls层的墙壁对象做一个专属Shader,让它只生成阴影但不被相机看到:
- 在Shader里添加
ColorMask 0,这样对象不会输出任何颜色,相机就看不到它了 - 保留阴影投射的Pass(比如内置管线里的
ShadowCasterPass),确保灯光能正常生成它的阴影 - 切换墙壁状态时:
- 要显示完整墙壁:给
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
相关产品推荐
相关产品推荐

