# Z-buffer

En infographie, le Z-buffer ou tampon de profondeur est une méthode employée dans le cadre de l'affichage d'une scène 3D. Le Z-Buffer permet de gérer le problème de la visibilité qui consiste à déterminer quels éléments de la scène doivent être rendus, lesquels sont cachés par d'autres et dans quel ordre l'affichage des primitives doit se faire.

## Description

Il est principalement utilisé par l'accélération matérielle de la 3D, mais l'est aussi dans beaucoup de moteurs 3D logiciels. L'algorithme du peintre est une autre solution pour résoudre en partie le problème de visibilité.
Lorsqu'un objet est dessiné par une carte accélératrice 3D, la profondeur d'un pixel (coordonnée Z) est stockée dans un tampon (en anglais 'buffer', d'où Z-buffer). Ce tampon est en général un tableau à deux dimensions (X et Y), chaque élément étant un pixel à l'écran. Si un autre élément de la scène doit être affiché aux mêmes coordonnées (X,Y), la carte compare les deux profondeurs (Z), et n'affiche que le pixel le plus proche de la caméra. La valeur Z de ce pixel est ensuite placée dans le tampon de profondeur, remplaçant donc l'ancienne. Finalement, l'image dessinée reproduit la perception de la profondeur habituelle et logique, l'objet le plus proche cachant les plus lointains.
La granularité du tampon de profondeur joue un rôle important sur la qualité de la scène. Un tampon avec des valeurs codées sur 16 bits peut engendrer des artefacts graphiques (appelés Z-fighting, combat de Z-buffer) quand deux objets sont très proches l'un de l'autre (seules 65536 profondeurs distinctes sont possibles). Un Z-buffer de 32 bits agit plus correctement. Les Z-buffers de 8 bits ne sont quasiment jamais utilisés en raison de leur trop faible précision.
Habituellement, la précision du Z-buffer n'est pas linéaire suivant la distance du point, proche ou lointain. Les valeurs proches sont plus précises (de façon à afficher les objets proches plus finement) que les valeurs lointaines (moins importantes visuellement). En général c'est le comportement voulu, mais cela peut amener des artefacts visuels au fond de la scène. Une variation de la technique du Z-buffer règle ce problème, elle s'appelle le W-buffer.
Au début de l'affichage d'une nouvelle scène, le Z-buffer doit être initialisé avec une valeur prédéfinie qui représente la profondeur maximale, en général zéro.
Sur les cartes graphiques des années 1999-2005, la gestion du Z-buffer utilise une quantité non négligeable de la bande passante mémoire. Plusieurs méthodes ont été employées pour réduire cet impact, comme la compression sans perte (la compression et la décompression par le processeur sont moins coûteuses que la bande passante graphique) ou l'effacement ultrarapide par le matériel lui-même, qui rendent donc obsolète la technique du "une fois positif, une fois négatif" (qui permettait d'éviter l'effacement en gérant des nombres signés).

## Mathématiques

La plage des valeurs de profondeur dans le volume de la camera ('camera space') à dessiner est souvent définie entre ${\mathit {near}}$ (valeur minimale), et ${\mathit {far}}$ (valeur au loin). Après la transformation de projection, la nouvelle valeur de $z$, ou $z'$, est définie par :
$z'={\frac {{\mathit {far}}+{\mathit {near}}}{{\mathit {far}}-{\mathit {near}}}}+{\frac {1}{z}}\left({\frac {-2\cdot {\mathit {far}}\cdot {\mathit {near}}}{{\mathit {far}}-{\mathit {near}}}}\right)$
Oú $z'$ est la nouvelle valeur de $z$, et est parfois appelé $w$ ou $w'$.
Les valeurs résultantes de $z'$ sont normalisées entre -1 et 1, où le plan $near$ est -1, et le plan $far$ à 1. Les valeurs en dehors de cette plage ne sont pas dans le volume vision, et ne doivent pas être dessinées.
Pour implémenter un Z-buffer, les valeurs de $z'$ sont interpolées linéairement sur la surface de l'écran entre les valeurs $z$ des points du polygone courant.

## Autres utilisations

Le Z-Buffer peut être utilisé pour d'autres effets graphiques comme des effets de flou dont l'intensité varie en fonction de la profondeur (pour simuler la profondeur de champ). La connaissance de la profondeur de chaque pixel permet aussi d'implémenter un effet de brouillard avec une densité maximale lorsque le pixel est éloigné.