TA工具箱首页 / TA 术语百科

Z-Fighting 深度冲突:原因与解决方案

2026-08-24

什么是 Z-Fighting

Z-Fighting(深度冲突)是指两个或多个平面在空间上非常接近时,由于深度缓冲(Z-Buffer)精度有限,无法准确区分它们的远近,导致渲染时交替显示不同表面的现象,表现为闪烁或纹理抖动。常见于共面几何体(如贴花、重叠平面)。

原因分析

深度缓冲通常使用非线性映射存储深度值,精度在近平面附近较高,远处较低。当两个表面距离小于深度缓冲可分辨的最小间隔时,GPU 可能错误判断哪个表面在前,导致深度测试随机通过,产生闪烁。此外,深度缓冲的位深(通常 24 位或 32 位)和远近平面比例也会影响精度。

解决方案

调整几何体

  • **增加距离**:将重叠表面分开,或微移位置(如沿法线偏移一点)。
  • **避免共面**:确保物体不共享同一平面,或使用不同高度。

调整深度缓冲设置

  • **减小远平面/近平面比例**:将远平面设得更近,或将近平面设得更远,可以提高整体深度精度。
  • **使用更高精度深度缓冲**:如使用 32 位浮点深度或反向 Z(Reverse-Z)技术。反向 Z 将深度映射反转,使远处精度更高,常用于现代渲染。

使用渲染技巧

  • **深度偏移(Depth Bias)**:在渲染时对多边形应用深度偏移,使其略微靠近摄像机,通常用于贴花、阴影等。在着色器中使用 `Offset` 或 API 设置。
  • **多边形偏移(Polygon Offset)**:类似深度偏移,基于斜率调整。
  • **分离渲染队列**:调整渲染顺序,确保先渲染远处的面。

引擎特定方法

  • **Unity**:在材质中设置 Render Queue 或使用 Shader 中的 Offset 参数。
  • **Unreal**:在材质中设置 Depth Bias 或使用 World Position Offset。

常见问题

Z-Fighting 和阴影痤疮有什么关系?

阴影痤疮(Shadow Acne)是阴影映射中的类似问题,由于深度比较精度不足导致的自阴影,通常使用深度偏移解决。

为什么远处更容易出现 Z-Fighting?

因为深度缓冲精度非线性,远处精度低,两个面距离即使较大也可能无法区分。

如何避免贴花和地板之间的 Z-Fighting?

使用深度偏移或调整渲染队列,让贴花略靠近摄像机。

移动端如何应对 Z-Fighting?

移动端深度缓冲通常为 16 位或 24 位,精度更低,需更注意几何体距离和深度范围。

反向 Z 有什么好处?

反向 Z 将浮点深度映射反转,使精度集中在远处,适合大场景,减少远处深度冲突。

常见问题

Z-Fighting 和阴影痤疮有什么关系?

阴影痤疮是阴影映射中的类似问题,由于深度比较精度不足导致自阴影,通常使用深度偏移解决。

为什么远处更容易出现 Z-Fighting?

因为深度缓冲精度非线性,远处精度低,两个面即使距离较大也可能无法区分。

如何避免贴花和地板之间的 Z-Fighting?

使用深度偏移或调整渲染队列,让贴花略靠近摄像机。

移动端如何应对 Z-Fighting?

移动端深度缓冲通常为16位或24位,精度更低,需更注意几何体距离和深度范围。

反向 Z 有什么好处?

反向Z将浮点深度映射反转,使精度集中在远处,适合大场景,减少远处深度冲突。