Unity3D:Line Renderer被下层物体Shader遮挡问题排查
问题排查:轨道线被遮挡的原因分析
场景参数
- 地球对象半径:6.4
- ISS轨道半径:6.8(轨道线明确位于地球上方)
- 相机模式:正交模式,近/远裁剪面设置为1/3000
现象
- 仅使用
Custom/EarthGround表面着色器时,Unity LineRenderer绘制的轨道线显示正常 - 同时启用该着色器与
EPIC/Projector2顶点片元着色器时,轨道线出现被遮挡的异常情况
着色器代码片段
Shader #1(Custom/EarthGround)
SubShader { Tags { "Queue"="Geometry" "IgnoreProjector"="False" "RenderType"="Opaque" } Cull Back ZWrite On ZTest LEqual ColorMask RGBA Fog{ } }
Shader #2(EPICProjector)
Subshader { Tags {"Queue"="Geometry"} Tags { "RenderType" = "Opaque" } Pass { Name "PROJECTOR" Blend SrcAlpha OneMinusSrcAlpha } }
效果对比
- 仅用Shader #1:轨道线无遮挡,正常显示
- 同时使用两个Shader:轨道线被遮挡
问题原因及修复方案
核心问题
Shader #2存在两处关键错误:
- 渲染队列与深度设置缺失:和Shader #1同用
Geometry队列,且未明确ZWrite和ZTest规则。Unity默认同一队列内按物体提交顺序渲染,投影着色器可能先于轨道线绘制,且混合模式下默认开启ZWrite On,会错误覆盖深度缓冲区,导致后续轨道线的深度测试判定为在后方,进而被遮挡。 - 标签重复定义:SubShader内的Tags被拆分两次设置,Unity会忽略重复标签,可能导致渲染排序逻辑异常,进一步打乱渲染顺序。
修复后的Shader #2代码
Subshader { Tags { "Queue"="Transparent" // 改为透明队列,确保在不透明物体后渲染 "RenderType" = "Transparent" "IgnoreProjector"="True" } Pass { Name "PROJECTOR" Blend SrcAlpha OneMinusSrcAlpha ZWrite Off // 混合时关闭深度写入,避免干扰其他物体的深度测试 ZTest LEqual // 明确深度测试规则 } }
补充说明
投影类着色器通常应使用Transparent或Overlay队列,确保在不透明物体(包括轨道线)之后渲染,同时关闭ZWrite防止破坏深度缓冲区的正确数据。
内容的提问来源于stack exchange,提问作者Mic
相关产品推荐
相关产品推荐

