Painter's algorithm

This is an old revision of this page, as edited by Sverdrup (talk | contribs) at 21:56, 18 June 2004 (ABC image right-aligned). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

The painter's algorithm is one of the simplest solutions to the visibility problem in 3D computer graphics. When projecting a 3D scene onto a 2D plane, it is at some point necessary to decide which polygons are visible and which are hidden.

The name "painter's algorithm" refers to a simple-minded painter who paints the distant parts of a scene at first and then covers them by those parts which are nearer. Similarly, the painter's algorithm sorts all the polygons by their depth and then paints them in this order. It will over-paint the parts that are normally not visible and thus solves the visibility problem.

The distant mountains are painted first, followed by the closer meadows; finally, the closest objects in this scene - the trees - are painted.

Note that this approach has several problems. What happens when polygon A partly covers B, B partly covers C and C partly covers A again? It's not possible to decide which polygon is above the others. Or when two polygons intersect one another in three dimensions? The painter's algorithm will fail in these cases.

Image: how painter's algorithm fail
Image: how painter's algorithm fail

In its naive implementation, painter's algorithm can prove to be highly inefficient. It forces the system to dutifully render each point on every polygon in the visible set - even if that polygon is occluded in the finished scene. This means that, for detailed scenes, the painter's algorthm generally proves to be a slow solution.

These and other problems with the painter's algorithm led to the development of Z-buffer techniques, which can be viewed as a logical development of the painter's algorithm by resolving depth conflicts on a pixel-by-pixel basis, thus reducing the need for a depth-based rendering order. Even in such systems, however, a variant of painter's algorithm is sometimes employed: as Z-buffer implementations generally rely on fixed-precision depth-buffer registers implemented in hardware, there is scope for visibility problems due to rounding error - these are manifest as subtle overlaps or gaps at joins between polygons. To avoid this, some graphics engine implementations "overrender" - drawing the affected edges both polygons in the order given by painter's algorithm. This means that some pixels are actually drawn twice (as in the full painters algorithm) but this proves to be only a tiny minority of the image, and so has negligible performance effect.