关掉深度测试换来的置顶会破坏整个场景
别名: 关闭深度测试 · 强制置顶 · always-on-top HUD
概念解释
菜单被墙挡住了,最省事的修法是关掉这块网格的深度测试,让它永远画在最前。关掉深度测试(depth-test disable)换来的置顶,会让菜单切穿近处的手、桌沿、他人肩线,以及场景里一切本来应该挡住它的东西。一块面板被修好了,整间房间的前后关系被写坏。这不是「深度顺序偶尔反了」,而是整条深度管道对这块物体停工。
机制
深度测试按像素问「这一点有没有更近的东西已经画过」。关掉它等于宣布这块网格不受那条问询约束,永远覆盖已经写进深度缓冲的内容。引擎里这是 HUD 的老习惯:屏幕空间本来就没有世界深度。搬进空间界面后,网格仍占一个世界位姿,人仍用遮挡和立体去读它,但它的像素表现像贴纸。近处体积从它「身体」里穿过,z-fighting 消失了,换成更稳定、更错误的「永远在前」。人会短暂用「这是一层抬头显示」来解释;解释在手和桌沿被切时破产,因为抬头显示不该占用一个会与房间相交的世界坐标。置顶还破坏立体匹配:左右眼都看见这块永远在前的皮,视差与它声称的世界距离对不上。
怎么研究
同一块需要「别被墙挡住」的面板,比较三种实现:关深度测试、先做遮挡再把面板搬到未遮挡位置、画成真正的头锁层且不占世界位姿。让人伸手、绕走、看旁人走过。
自变量:深度测试开或关、面板是否仍有世界位姿、近场是否有手和家具。 因变量:被切穿的近场物体次数、深度顺序判断正确率、主观「场景还整不整」、误把面板当成可贴的墙面或可抓的物体。
截一帧深度缓冲就能确认是不是关了测试——主观分数之前先查这一层实现。
边界
真正的屏幕空间层(校准光标、系统电量,明确不占世界)可以关深度测试,前提是轮廓不去切近场物体,或根本画在中央小块。全黑虚空、没有近场体积的场景里,置顶的伤害测不出来。光学透视上深度测试本来就管不住真实光,关不关对「挡不挡得住窗户」无差别,但仍会切虚拟手和虚拟家具。调试用的永远在前的坐标轴不该进发布。
怎么落地
- 需要不被环境挡住的世界面板:搬位置或缩尺寸,不要关深度测试。
- 必须永远在最前的元素,做成明确的头锁层,并限制轮廓,避免去切手和桌沿。
- 代码审查里把「DisableZTest / overlay queue」列为空间网格的禁默认,只允许登记过的屏幕空间例外。
- 验证:打开面板,伸手到它和眼睛之间,再绕到它侧面。手或家具被面板切开,就是置顶在破坏场景;把深度测试开回去,伤害应立刻消失。