跳到主要内容
← 全部概念
3D 与渲染 / 08

深度冲突

两个表面争抢同一批像素

交互演示

交互演示 · 移动指针或点击画面,观察变化

当两个表面位于相同深度时,深度缓冲中的舍入误差会逐像素决定显示哪一个,从而产生闪烁,这就是深度冲突。深度缓冲将大部分精度分配在近裁剪面附近,因此把近裁剪面从 0.1 改为 0.01,会让远处表面可用的精度空间减少到十分之一。左侧黄色贴花与地面完全重合,碎裂成闪烁条纹;右侧使用多边形偏移将贴花朝镜头方向拉近,因此保持完整稳定。

适用场景

在已有表面上绘制贴花时,使用多边形偏移,或让几何表面稍微分离。在条件允许时收紧镜头的近、远裁剪面范围,以提高深度精度。

实现示例

不依赖特定引擎的伪代码。请根据你使用的引擎调整函数和坐标约定。

camera.near = 0.1
camera.far = requiredViewDistance
decal.position = hit.point + hit.normal * smallOffset
// 也可以配置材质的深度偏移或多边形偏移。

常见错误

把近裁剪面设得极其接近零,可能浪费深度精度。过大的偏移会让贴花看起来悬空;应针对渲染器调整偏移,并从接近表面切线的角度检查效果。

延伸阅读

Three.js 手册 ↗
内容原作 Nicolas Zullo · 中文整理与交互改编