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控制绘制顺序。

 

posted @ 2026-04-27 15:11  SimoonJia  阅读(7)  评论(0)    收藏  举报