Unity升级URP后透明材质无法投射阴影如何解决
问题根因
这是URP与内置SRP的默认逻辑差异,不是平台兼容bug:内置SRP默认允许Transparent/Fade渲染队列的物体执行阴影投射Pass,URP出于移动端性能考量默认屏蔽了透明物体的阴影投射逻辑——哪怕材质Alpha值拉满为1、Mesh Renderer开了阴影投射,只要材质Surface Type设为Transparent,默认就不会写入阴影深度,自然不会投射阴影。该逻辑在Unity 2021 LTS、2022 Apple Silicon版本下表现一致。
解决方案
方案1:开启URP原生透明阴影(最快适配,满足绝大多数场景需求)
按以下顺序改配置即可对齐内置SRP的基础透明阴影效果:
- 定位项目使用的URP管线配置资产(通常存放在
Settings渲染配置目录,命名格式类似UniversalRenderPipelineAsset) - 在资产的
Shadows配置栏找到透明阴影选项:- 勾选
Enable Transparent Shadows - 按项目视野需求调整
Shadow Distance,确保需要投射阴影的透明物体在阴影有效绘制范围内
- 勾选
- 选中异常的透明材质,在Inspector面板做配置校验:
- 若物体本身Alpha值恒为1、不存在半透明显示需求,直接将
Surface Type从Transparent切为Opaque,性能比透明队列高30%以上,阴影表现和内置SRP完全一致 - 确需半透明效果的材质,按需求将
Blend Mode设为Alpha(对应内置SRP的Fade/Transparent模式),展开面板最下方的Advanced折叠栏,勾选Transparent Cast Shadows(该选项仅在管线资产开启透明阴影开关后才会显示) - 确认挂载材质的Mesh Renderer组件上,
Cast Shadows选项设为On,需要双面阴影时再选Two Sided
- 若物体本身Alpha值恒为1、不存在半透明显示需求,直接将
方案2:自定义Shader Pass(需要1:1对齐内置SRP半透明阴影衰减效果时使用)
开启原生开关后如果发现半透明阴影的浓淡和内置SRP不一致,是因为URP默认透明阴影Pass仅裁剪Alpha低于阈值的片元,不会根据Alpha值做阴影衰减,直接在所用透明Shader中新增如下ShadowCaster Pass即可:
Pass { Name "ShadowCaster" Tags { "LightMode" = "ShadowCaster" } ZWrite On ZTest LEqual ColorMask 0 HLSLPROGRAM #pragma vertex ShadowPassVertex #pragma fragment ShadowPassFragment // 关键宏:开启透明混合的阴影Alpha采样 #pragma _ALPHABLEND_ON #pragma _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A #include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl" #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl" ENDHLSL }
排查注意点
- 版本校验:Unity 2021 LTS需将URP包升级至12.1.11及以上补丁版本,Unity 2022 版本需将URP包升级至14.0.9及以上补丁版本,早期小版本存在Apple Silicon Metal API下透明阴影Pass被错误剔除的bug
- 基础配置校验:确认场景相机勾选
Render Shadows,投射阴影的主光源Shadows属性设为Hard Shadows/Soft Shadows,未选None - 缓存清理:如果用了SRP Batcher,改完配置后清理项目Library文件夹下的缓存再重启编辑器,避免旧材质Shader缓存导致配置不生效
效果参考
- 不透明材质正常阴影表现:

- 修复前透明材质无阴影表现:

- 材质配置面板参考:

内容的提问来源于stack exchange,提问作者user15782390
相关产品推荐
相关产品推荐

