Unity VR:XR Toolkit中透明材质遮挡传送线问题
问题描述
使用Unity XR Toolkit开发VR项目时,为实现传送时的黑屏淡入淡出效果,在相机正前方添加了一个挂载无光照透明材质的Quad,通过脚本控制材质alpha值实现淡黑效果,但遇到以下问题:
- 即使材质完全透明(alpha=0),传送线仍无法显示
- 按下传送按钮后,传送线会短暂显示随即消失
- 尝试修改材质渲染队列(2000、3000、2999、3001)均无效
- 将传送线材质替换为非默认线纹理材质后,问题消失,但丢失了原本的颜色变化效果
使用的Shader源码如下:
Shader "Unlit/Unlit Transparent Color" { Properties { _Color ("Main Color", Color) = (0,0,0,1) } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 100 Fog {Mode Off} ZTest Always Blend One OneMinusSrcAlpha Color [_Color] Pass {} } }
问题原因
核心问题出在Shader的ZTest Always设置:
- 该参数强制Quad的深度测试永远通过,无论它与相机的距离是否比传送线更远,会让Quad始终渲染在所有物体(包括传送线)的前面
- 即使材质alpha=0,透明渲染的Blend操作仍会干扰后续物体的颜色输出,导致传送线被“遮挡”
解决方案
修改Shader的深度测试规则,并补充透明物体的标准渲染参数:
Shader "Unlit/Unlit Transparent Color" { Properties { _Color ("Main Color", Color) = (0,0,0,1) } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 100 Fog {Mode Off} // 替换ZTest Always为默认的LEqual,确保只渲染在比它远的物体前面 ZTest LEqual // 透明物体禁用深度写入,避免影响后续物体的深度测试 ZWrite Off Blend One OneMinusSrcAlpha Color [_Color] Pass {} } }
额外优化建议:
- 将Quad的位置调整到相机近裁剪面之外(比如0.1m处),避免和相机自身的近裁面冲突
- 确认传送线的渲染队列优先级低于Quad(保持Quad在Transparent队列,传送线设为Transparent+1即可)
内容的提问来源于stack exchange,提问作者Heinz Sander
相关产品推荐
相关产品推荐

