Z-fighting

From Wikipedia, the free encyclopedia

Coplanar polygons
Coplanar polygons

Z-fighting is a phenomenon in 3D rendering that occurs when two or more primitives have similar values in the Z-buffer, and is particularly prevalent with coplanar polygons. The effect causes pseudo-random pixels to be rendered with the color of one polygon or another in a non-deterministic manner, varying as the scene is animated, causing one polygon to "win" the z test, then another, and so on. The overall effect is a flickering noisy rasterization of two polygons which "fight" to color the screen pixels. This problem is usually caused by limited sub-pixel precision and floating point & fixed point round-off errors.

Z-fighting can be reduced through the use of a higher resolution depth buffer, by W-buffering in some scenarios, or by simply moving the polygons further apart. Z-fighting which cannot be entirely eliminated in this manner is often resolved by the use of a stencil buffer, or by applying a post transformation screen space Z-buffer offset to one polygon which does not affect the projected shape on screen, but does affect the z-buffer value to eliminate the overlap during pixel interpolation and comparison. Where Z-fighting is caused by different transformation paths in hardware for the same geometry (for example in a multi-pass rendering scheme) it can sometimes be resolved by requesting that the hardware use invariant vertex transformation.

The more z-buffer precision one uses the less likely it is that z-fighting will be encountered but it is inevitable that coplanar polygons will exhibit this problem unless corrective action is taken.

As the distance between near and far clip planes increases and in particular the near plane is selected near the eye, the greater the likelihood exists that you will encounter Z-fighting between primitives. With large virtual environments inevitably there is an inherent conflict between the need to resolve visibility in the distance and in the foreground, so for example in a space flight sim if you draw a distant galaxy to scale you will not have the precision to resolve visibility on any cockpit geometry in the foreground (although even a numerical representation would present problems prior to zbuffered rendering). To mitigate these problems, zbuffer precision is weighted towards the near clip plane, but this is not the case with all visibility schemes and it is insufficient to eliminate all Z-fighting issues.