depthWrite depthTest renderOrder
这三个是透明物体、遮挡关系、渲染顺序的高频面试题,而且很容易混。
一句话先区分
depthTest 决定要不要做深度比较
depthWrite 决定要不要写入深度缓冲
renderOrder 决定谁先画
它们解决的是三个不同问题。
1. depthTest(深度测试)
是否做遮挡判断。
在 Three.js:
material.depthTest = true
默认:
true
原理
GPU会比较:
当前像素深度
vs
深度缓冲已有深度
如果当前更远:
丢弃
例子
前面:
红盒子
后面:
蓝盒子
有 depthTest:
蓝盒被挡住
正常。
关闭:
depthTest = false
变:
永远画出来
不管前后遮挡
常用于:
- UI
- HUD
- Gizmo
- 标签永远在前
2. depthWrite(写深度)
是否把自己写进 depth buffer。默认:true
material.depthWrite = true
和 depthTest 区别
很多人混:
depthTest 读深度
depthWrite 写深度
为什么透明常关它
透明物体:
transparent:true
depthWrite:false
很常见。
因为否则:
前面半透明先写深度:
后面的透明会被错误挡住。
经典问题:
透明穿帮
3. renderOrder
手动指定谁先画。
mesh.renderOrder = 10
数值越小:
先画。
用途
默认渲染器会排序。
但有时你想强行:
A先画
B后画
自己指定。
例:
标签最后画:
label.renderOrder = 999
注意
它只影响顺序:
不改变深度逻辑。
很多人误会:
renderOrder ≠ 禁止遮挡
4. 三个一起看
默认:
depthTest:true
depthWrite:true
renderOrder:0
标准实体。
永远显示在最前
depthTest:false
renderOrder:999
半透明材质
transparent:true
depthWrite:false
穿墙标注常见:
depthTest:false
depthWrite:false
renderOrder:999
5. 三者关系图
先决定谁先画 -> renderOrder
画的时候要不要比较遮挡 -> depthTest
画完要不要写入深度 -> depthWrite
为什么透明常关 depthWrite,不关 depthTest?
正确:
还要参与遮挡判断
但不要污染深度缓冲
为什么 renderOrder 有时不生效?
因为深度测试还在起作用。
你调顺序:
还是被 depth buffer 挡住。
这是经典坑。
depthTest控制深度比较,
depthWrite控制是否写深度缓冲,
renderOrder控制绘制顺序。

浙公网安备 33010602011771号