使用Sprite Shader时出现精灵遮挡顺序错误问题求助
Sprite阴影渲染顺序异常与UI遮挡问题解决
问题根源
- 渲染顺序错乱:Unity原生2D Sprite依赖
Sorting Layer和Order in Layer控制前后层级,默认Shader关闭Depth Write,靠渲染队列顺序叠加。你的自定义Shader Graph如果没适配这套2D排序逻辑,就会导致实际靠后的树被错误渲染在前方。 - UI被遮挡:开启Depth Write后,Sprite会向深度缓冲写入自身深度值。若UI使用
Screen Space - Camera模式,其平面距离若大于Sprite的Z轴位置,就会被深度测试挡住;即使是Overlay模式,部分UI Shader也会受全局深度缓冲影响。
修复方案
方案1:适配2D排序逻辑(不开启Depth Write)
- 创建Shader时选择Sprite模板,或在Graph Settings中设置:
- Render Type:
Transparent - Render Queue:
Transparent
- Render Type:
- 在Shader Graph中添加2D排序支持:
- 引入
_SortingLayerID和_OrderInLayer内置变量,在Vertex阶段对Clip Space Position的Z值做偏移,让Unity的2D排序系统生效。新版本Shader Graph可直接使用Sorting Offset节点实现。 - 保持Depth Test为
Less Equal,既兼容3D物体深度,又不破坏2D层级排序。
- 引入
方案2:开启Depth Write同时保留UI显示
如果需要Depth Write(比如和3D物体交互阴影),可通过以下方式规避UI遮挡:
- 调整Canvas参数:若用
Screen Space - Camera,将Canvas的Plane Distance设为比所有Sprite的Z轴位置更近(例如Sprite在Z=0,Canvas设为Z=-10),让UI深度值更小,优先渲染且不被遮挡。 - 修改UI Shader:给UI使用的Shader开启
Depth Test = Off,让UI忽略深度缓冲,始终显示在最上层。 - 分离渲染队列:将Sprite Shader的Render Queue设为
Transparent+100(或更高),UI保持默认Transparent队列,确保UI先于Sprite渲染,不受Sprite深度值影响。
额外排查点
- 检查Sprite的
Sorting Layer和Order in Layer:确保树的Sorting Layer优先级低于房子,或Order值更小(值越小越先渲染,显示在后方)。 - 确认Sprite的Z轴位置:2D项目中Z值越大离相机越远,若树的Z值比房子小,会导致深度测试错误,需统一调整Z轴到同一平面或按层级设置。
内容的提问来源于stack exchange,提问作者Laurent Charles
相关产品推荐
相关产品推荐

