Jump to content

Z-buffering

From Wikipedia, the free encyclopedia
(Redirected fromDepth buffer)
Z-buffer data

Adepth buffer,also known as az-buffer,is a type ofdata bufferused incomputer graphicsto represent depth information of objects in3D spacefrom a particularperspective.The depth is stored as a height map of the scene, the values representing a distance to camera, with 0 being the closest. The encoding scheme may be flipped with the highest number being the value closest to camera. Depth buffers are an aid torenderinga scene to ensure that the correctpolygonsproperly occlude other polygons. Z-buffering was first described in 1974 by Wolfgang Straßer in his PhD thesis on fast algorithms for rendering occluded objects.[1]A similar solution to determining overlapping polygons is thepainter's algorithm,which is capable of handling non-opaque scene elements, though at the cost of efficiency and incorrect results.

In a3D-rendering pipeline,when an object is projected on the screen, the depth (z-value) of a generatedfragmentin the projected screen image is compared to the value already stored in the buffer (depth test), and replaces it if the new value is closer. It works in tandem with therasterizer,which computes the colored values. The fragment output by the rasterizer is saved if it is not overlapped by another fragment.

When viewing an image containing partially or fully overlapping opaque objects or surfaces, it is not possible to fully see those objects that are farthest away from the viewer and behind other objects (i.e., some surfaces are hidden behind others). If there were no mechanism for managing overlapping surfaces, surfaces would render on top of each other, not caring if they are meant to be behind other objects. The identification and removal of these surfaces are called thehidden-surface problem.To check for overlap, the computer calculates the z-value of a pixel corresponding to the first object and compares it with the z-value at the same pixel location in the z-buffer. If the calculated z-value is smaller than the z-value already in the z-buffer (i.e., the new pixel is closer), then the current z-value in the z-buffer is replaced with the calculated value. This is repeated for all objects and surfaces in the scene (often inparallel). In the end, the z-buffer will allow correct reproduction of the usual depth perception: a close object hides one further away. This is calledz-culling.

The z-buffer has the same internal data structure as an image, namely a 2D-array, with the only difference being that it stores a single value for each screen pixel instead of color images that use 3 values to create color. This makes the z-buffer appear black-and-white because it is not storing color information. The buffer has the same dimensions as the screen buffer for consistency.

Primary visibility tests (such asback-face culling) and secondary visibility tests (such as overlap checks and screen clipping) are usually performed on objects' polygons in order to skip specific polygons that are unnecessary to render. Z-buffer, by comparison, is comparativelyexpensive,so performing primary and secondary visibility tests relieve the z-buffer of some duty.

The granularity of a z-buffer has a great influence on the scene quality: the traditional16-bitz-buffer can result inartifacts(called "z-fighting"orstitching) when two objects are very close to each other. A more modern24-bitor32-bitz-buffer behaves much better, although the problem cannot be eliminated without additional algorithms. An8-bitz-buffer is almost never used since it has too little precision.

Uses

[edit]

Z-buffering is a technique used in almost all contemporary computers, laptops, and mobile phones for performing3D computer graphics.The primary use now is forvideo games,which require fast and accurate processing of 3D scenes. Z-buffers are often implemented in hardware within consumergraphics cards.Z-buffering is also used (implemented as software as opposed to hardware) for producing computer-generated special effects for films.[citation needed]

Furthermore, Z-buffer data obtained from rendering a surface from a light's point-of-view permits the creation of shadows by theshadow mappingtechnique.[2]

Developments

[edit]

Even with small enough granularity, quality problems may arise whenprecisionin the z-buffer's distance values are not spread evenly over distance. Nearer values are much more precise (and hence can display closer objects better) than values that are farther away. Generally, this is desirable, but sometimes it will cause artifacts to appear as objects become more distant. A variation on z-buffering which results in more evenly distributed precision is calledw-buffering(seebelow).

At the start of a new scene, the z-buffer must be cleared to a defined value, usually 1.0, because this value is the upper limit (on a scale of 0 to 1) of depth, meaning that no object is present at this point through theviewing frustum.

The invention of the z-buffer concept is most often attributed toEdwin Catmull,although Wolfgang Straßer described this idea in his 1974 Ph.D. thesis months before Catmull's invention.[a]

On more recent PC graphics cards (1999–2005), z-buffer management uses a significant chunk of the availablememorybandwidth.Various methods have been employed to reduce the performance cost of z-buffering, such aslossless compression(computer resources to compress/decompress are cheaper than bandwidth) and ultra-fast hardware z-clear that makes obsolete the "one frame positive, one frame negative" trick (skipping inter-frame clear altogether using signed numbers to cleverly check depths).

Some games, notably several games later in theN64's life cycle, decided to either minimize Z buffering (for example, rendering the background first without z buffering and only using Z buffering for the foreground objects) or to omit it entirely, to reduce memory bandwidth requirements and memory requirements respectively.Super Smash Bros.andF-Zero Xare two N64 games that minimized Z buffering to increase framerates. SeveralFactor 5games also minimized or omitted Z buffering. On the N64 Z Buffering can consume up to 4x as much bandwidth as opposed to not using Z buffering.[3]

Mechwarrior 2on PC supported resolutions up to 800x600[4]on the original 4 MB 3DFX Voodoo due to not using Z Buffering.


Z-culling

[edit]

Inrendering,z-culling is early pixel elimination based on depth, a method that provides an increase in performance when rendering of hidden surfaces is costly. It is a direct consequence of z-buffering, where the depth of each pixel candidate is compared to the depth of the existing geometry behind which it might be hidden.

When using a z-buffer, a pixel can be culled (discarded) as soon as its depth is known, which makes it possible to skip the entire process of lighting andtexturinga pixel that would not bevisibleanyway. Also, time-consumingpixel shaderswill generally not be executed for the culled pixels. This makes z-culling a good optimization candidate in situations wherefillrate,lighting, texturing, or pixel shaders are the mainbottlenecks.

While z-buffering allows the geometry to be unsorted, sortingpolygonsby increasing depth (thus using a reversepainter's algorithm) allows each screen pixel to be rendered fewer times. This can increase performance in fillrate-limited scenes with large amounts of overdraw, but if not combined with z-buffering it suffers from severe problems such as:

  • polygons might occlude one another in a cycle (e.g.: triangle A occludes B, B occludes C, C occludes A), and
  • there is no canonical "closest" point on a triangle (e.g.: no matter whether one sorts triangles by theircentroidor closest point or furthest point, one can always find two triangles A and B such that A is "closer" but in reality B should be drawn first).

As such, a reverse painter's algorithm cannot be used as an alternative to Z-culling (without strenuous re-engineering), except as an optimization to Z-culling. For example, an optimization might be to keep polygons sorted according to x/y-location and z-depth to provide bounds, in an effort to quickly determine if two polygons might possibly have an occlusion interaction.

Mathematics

[edit]

The range of depth values incamera spaceto be rendered is often defined between aandvalue of.

After aperspective transformation,the new value of,or,is defined by:

After anorthographic projection,the new value of,or,is defined by:

whereis the old value ofin camera space, and is sometimes calledor.

The resulting values ofare normalized between the values of -1 and 1, where theplaneis at -1 and theplane is at 1. Values outside of this range correspond to points which are not in the viewingfrustum,and shouldn't be rendered.

Fixed-point representation

[edit]

Typically, these values are stored in the z-buffer of the hardware graphics accelerator infixed pointformat. First they are normalized to a more common range which is[0, 1]by substituting the appropriate conversioninto the previous formula:

Simplifying:

Second, the above formula is multiplied bywhere d is the depth of the z-buffer (usually 16, 24 or 32 bits) and rounding the result to an integer:[5]

This formula can be inverted and derived in order to calculate the z-buffer resolution (the 'granularity' mentioned earlier). The inverse of the above:

where

The z-buffer resolution in terms of camera space would be the incremental value resulted from the smallest change in the integer stored in the z-buffer, which is +1 or -1. Therefore, this resolution can be calculated from the derivative ofas a function of:

Expressing it back in camera space terms, by substitutingby the above:

This shows that the values ofare grouped much more densely near theplane, and much more sparsely farther away, resulting in better precision closer to the camera. The smalleris, the less precision there is far away—having theplane set too closely is a common cause of undesirable rendering artifacts in more distant objects.[6]

To implement a z-buffer, the values ofarelinearly interpolatedacross screen space between theverticesof the currentpolygon,and these intermediate values are generally stored in the z-buffer infixed pointformat.

W-buffer

[edit]

To implement a w-buffer,[7]the old values ofin camera space, or,are stored in the buffer, generally infloating pointformat. However, these values cannot be linearly interpolated across screen space from the vertices—they usually have to beinverted,interpolated, and then inverted again. The resulting values of,as opposed to,are spaced evenly betweenand.There are implementations of the w-buffer that avoid the inversions altogether.

Whether a z-buffer or w-buffer results in a better image depends on the application.

Algorithmics

[edit]

The followingpseudocodedemonstrates the process of z-buffering:

// First of all, initialize the depth of each pixel.
d(i, j) = infinite // Max length

// Initialize the color value for each pixel to the background color
c(i, j) = background color

// For each polygon, do the following steps:
for (each pixel in polygon's projection)
{
// Find depth i.e, z of polygon
// at (x, y) corresponding to pixel (i, j)
if (z < d(i, j))
{
d(i, j) = z;
c(i, j) = color;
}
}

See also

[edit]

References

[edit]
  1. ^Straßer, Wolfgang (April 26, 1974). "Zukünftige Arbeiten".Schnelle Kurven- und Flächendarstellung auf grafischen Sichtgeräten[Fast curve and surface display on graphic display devices](PDF)(in German). Berlin. 6-1.{{cite book}}:CS1 maint: location missing publisher (link)
  2. ^Akenine-Möller, Tomas; Haines, Eric; Hoffman, Naty (2018-08-06).Real-Time Rendering, Fourth Edition.CRC Press.ISBN978-1-351-81615-1.
  3. ^How I implemented MegaTextures on real Nintendo 64 hardware,retrieved2024-01-04
  4. ^3D Acceleration Comparison Ep11: Mechwarrior 2 - 3DFX / PowerVR / S3 Virge / ATI Rage / Matrox Mys,retrieved2024-01-04
  5. ^The OpenGL Organization."Open GL / FAQ 2 - Depth Buffer Precision".Retrieved2017-12-26.
  6. ^Grégory Massal."Depth buffer - the gritty details".Archived fromthe originalon 15 October 2008.Retrieved2008-08-03.
  7. ^Steve Baker."Learning to Love your Z-buffer".Retrieved2018-01-03.
[edit]

Notes

[edit]
  1. ^SeeWolfgang K. Giloi[de],J. L. Encarnação, W. Straßer. "The Giloi’s School of Computer Graphics". Computer Graphics 35 4:12–16.