Mémoires tampons de profondeurs

Une mémoire tampon de profondeur, ou z-buffer, stocke les informations de profondeur pour contrôler les zones de polygones qui sont rendues plutôt que masquées.

Aperçu

Une mémoire tampon de profondeur, souvent appelée z-buffer ou w-buffer, est une propriété de l’appareil qui stocke les informations de profondeur à utiliser par Direct3D. Lorsque Direct3D restitue une scène sur une surface cible, il peut utiliser la mémoire d’une surface tampon de profondeur associée en tant qu’espace de travail pour déterminer comment les pixels des polygones rastérisés s’obstruent les uns les autres. Direct3D utilise une surface Direct3D hors écran comme cible sur laquelle les valeurs de couleur finales sont écrites. La surface de mémoire tampon de profondeur associée à la surface cible de rendu est utilisée pour stocker les informations de profondeur qui indiquent à Direct3D la profondeur de chaque pixel visible dans la scène.

Lorsqu’une scène est rastérisée avec la mise en mémoire tampon de profondeur activée, chaque point de la surface de rendu est testé. Les valeurs de la mémoire tampon de profondeur peuvent être la coordonnée z d’un point ou sa coordonnée w homogène à partir de l’emplacement du point (x,y,z,w) dans l’espace de projection. Une mémoire tampon de profondeur qui utilise des valeurs z est souvent appelée mémoire tampon z, et celle qui utilise des valeurs w est appelée w-buffer. Chaque type de mémoire tampon de profondeur présente des avantages et des inconvénients, qui sont abordés plus loin.

Au début du test, la valeur de profondeur dans la mémoire tampon de profondeur est définie sur la valeur la plus grande possible pour la scène. La valeur de couleur sur la surface de rendu est définie sur la valeur de couleur d’arrière-plan ou sur la valeur de couleur de la texture d’arrière-plan à ce stade. Chaque polygone de la scène est testé pour voir s’il croise la coordonnée actuelle (x,y) sur la surface de rendu.

Si elle se croise, la valeur de profondeur ( qui sera la coordonnée z dans une mémoire tampon z et la coordonnée w dans une mémoire tampon w ) au point actuel est testée pour voir si elle est inférieure à la valeur de profondeur stockée dans la mémoire tampon de profondeur. Si la profondeur de la valeur du polygone est plus petite, elle est stockée dans la mémoire tampon de profondeur et la valeur de couleur du polygone est écrite sur le point actuel sur la surface de rendu. Si la valeur de profondeur du polygone à ce point est plus grande, le polygone suivant dans la liste est testé. Ce processus est illustré dans le diagramme suivant.

diagramme des valeurs de profondeur de test

Techniques de mise en mémoire tampon

Bien que la plupart des applications n’utilisent pas cette fonctionnalité, vous pouvez modifier la comparaison utilisée par Direct3D pour déterminer quelles valeurs sont placées dans la mémoire tampon de profondeur, puis dans la surface cible de rendu. Sur certains matériels, la modification de la fonction de comparaison peut désactiver les tests z hiérarchiques.

Presque tous les accélérateurs sur le marché prennent en charge la mise en mémoire tampon z, ce qui fait des z-buffers le type de mémoire tampon de profondeur le plus courant aujourd’hui. Même si elles sont omniprésentes, les z-buffers présentent leurs inconvénients. En raison des mathématiques impliquées, les valeurs z générées dans une mémoire tampon z ont tendance à ne pas être réparties uniformément dans la plage de mémoire tampon z (généralement de 0,0 à 1,0, inclus).

Plus précisément, le rapport entre les plans de découpage lointain et proche affecte fortement la répartition inégale des valeurs z. À l’aide d’un rapport entre la distance du plan lointain et la distance du plan proche de 100, 90 pour cent de la plage de mémoire tampon de profondeur est dépensée sur les 10 premiers pour cent de la plage de profondeur de la scène. Les applications classiques pour le divertissement ou les simulations visuelles avec des scènes extérieures nécessitent souvent des ratios plan/plan proche de 1 000 à 10 000. Avec un rapport de 1 000, 98 % de la plage est consacrée aux 2 premiers % de la plage de profondeur, et la distribution s’aggrave avec des ratios plus élevés. Cela peut entraîner des artefacts de surface masqués dans des objets distants, en particulier lors de l’utilisation de mémoires tampons de profondeur 16 bits, les plus couramment prises en charge.

En revanche, une mémoire tampon de profondeur basée sur w est souvent répartie plus uniformément entre les plans de clip proche et lointain qu’une mémoire tampon z. L’avantage clé est que le ratio des distances pour les plans de coupe loin et proche n’est plus un problème. Cela permet aux applications de prendre en charge des plages maximales importantes, tout en obtenant une mise en mémoire tampon de profondeur relativement précise à proximité du point visuel. Une mémoire tampon de profondeur w n’est pas parfaite et peut parfois présenter des artefacts de surface masqués pour les objets proches. Un autre inconvénient de l’approche w-buffered est lié à la prise en charge matérielle : la mise en mémoire tampon w n’est pas prise en charge aussi largement dans le matériel que z-buffering.

L’utilisation d’une mémoire tampon z nécessite une surcharge pendant le rendu. Différentes techniques peuvent être utilisées pour optimiser le rendu lors de l’utilisation de z-buffers. Les applications peuvent augmenter les performances lors de l’utilisation de la mise en mémoire tampon z et de la texturation en veillant à ce que les scènes soient rendues de l’avant vers l’arrière. Les primitives z-buffered texturées sont prétestées sur la mémoire tampon z sur une ligne d’analyse. Si une ligne d’analyse est masquée par un polygone précédemment rendu, le système la rejette rapidement et efficacement. La mise en mémoire tampon Z peut améliorer les performances, mais la technique est plus utile lorsqu’une scène dessine les mêmes pixels plusieurs fois. C’est difficile à calculer exactement, mais vous pouvez souvent faire une approximation étroite. Si les mêmes pixels sont dessinés moins de deux fois, vous pouvez obtenir les meilleures performances en désactivant la mise en mémoire tampon z et en rendant la scène de l’arrière vers l’avant.

L’interprétation réelle d’une valeur de profondeur est spécifique au convertisseur.

Mémoires tampons de profondeurs et de gabarits