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

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存在两处关键错误:

  1. 渲染队列与深度设置缺失:和Shader #1同用Geometry队列,且未明确ZWrite和ZTest规则。Unity默认同一队列内按物体提交顺序渲染,投影着色器可能先于轨道线绘制,且混合模式下默认开启ZWrite On,会错误覆盖深度缓冲区,导致后续轨道线的深度测试判定为在后方,进而被遮挡。
  2. 标签重复定义: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:35:26