Skip to main content
Cette rubrique décrit les formats de bas niveau de compression et de décompression des couleurs des cibles de rendu utilisés par le matériel graphique.

Pipeline graphique

Le diagramme suivant présente le pipeline graphique logique. Les blocs de profondeur et de couleur sont les deux dernières opérations logiques avant la sortie de rendu. Pipeline graphique logique Les formats de compression de texture sont gérés différemment de ceux de la couleur et de la profondeur. Pour plus d’informations, consultez Gestion native des ressources pour XBOX One.

Terminologie de la compression des couleurs

Voici les termes couramment utilisés pour décrire les systèmes de compression.

Le bloc de couleur

Le bloc de couleur est chargé de transférer en mémoire les données de couleur produites par le pixel shader. Ce processus comprend la gestion de la compression MSAA, le mélange des couleurs, le formatage des couleurs, les ROP et l’écriture en mémoire. Le bloc de couleur permet de combiner la couleur de sortie du shader pour un pixel (couleur source, CS) avec la couleur actuelle de ce pixel dans la cible de rendu (couleur de destination, CD) à l’aide de facteurs de mélange (BF(S,D)) et d’une fonction de combinaison spécifiée. L’équation générale de ce mélange est appelée équation de mélange.
Le bloc de couleur est chargé de convertir la couleur de sortie du shader, au format UINT32, SINT32, FP32 ou FP16, au format de la cible de rendu. Seules les conversions uint->uint, sint->sint, unorm->unorm, snorm->snorm et FP->non-entier sont prises en charge. Le shader produit des sorties UINT32, SINT32 et FP32. Le système de shaders convertit FP32 en FP16 ou en U/SNORM16 selon les besoins, pour des raisons de performances. Le bloc de couleur prend en charge plusieurs fonctionnalités spéciales :
  • Un mode de mélange spécial appelé mélange à double source. Alors que la plupart des facteurs de mélange dépendent de la couleur source, de la couleur de destination ou de la couleur constante de mélange, le mélange à double source utilise une seconde couleur de sortie du shader (affectée à MRT1) comme facteurs de mélange. La couleur source de l’équation de mélange provient de MRT0.
  • MSAA 2x, 4x et 8x. Le bloc de couleur comporte plusieurs fonctionnalités propres au MSAA, comme la résolution matérielle de toute surface pouvant être mélangée à l’aide d’un filtre boîte (calcul de la moyenne des sous-échantillons d’un pixel pour obtenir sa couleur finale), ainsi que la compression des couleurs (décrite dans la section suivante).
  • Un tampon d’image avec correction gamma utilisant le format 8_8_8_8 sRGB.
  • L’effacement rapide de la surface de couleur. Il est obtenu en effaçant uniquement les bits CMask associés à chaque tuile de la surface. Lorsque des quads sont dessinés dans des tuiles effacées rapidement, le bloc de couleur dispose d’un matériel spécial pour remplir a posteriori les parties des tuiles qui n’ont pas été touchées.
Une cible de rendu effacée rapidement peut nécessiter l’écriture de sa couleur d’effacement dans les tuiles qui ne recoupent pas la géométrie rendue après l’effacement, au moment où la surface de rendu doit être lue. C’est ce qu’on appelle l’élimination de l’effacement rapide. En pratique, les zones effacées dans le CMask doivent être répliquées comme effacées sur la surface principale. Le bloc de couleur est implémenté sous la forme d’un pipeline à trois étapes.
  1. Le cache CMask gère les informations de compression au niveau des tuiles.
  2. Le cache FMask gère les informations de compression au niveau des quads.
  3. Le cache de couleur et le mélangeur effectuent les mises à jour des pixels.

Compression des couleurs

L’anticrénelage multiéchantillon (MSAA) est une méthode permettant de réduire les artefacts visuels dus à la résolution limitée des pixels. Avec le MSAA, la valeur finale de chaque pixel est déterminée par 2, 4 ou 8 échantillons de couleur prélevés dans le pixel. Chacun de ces échantillons reçoit la même couleur du pixel shader, mais chaque échantillon fait l’objet d’un test de profondeur distinct. On obtient ainsi des détails plus fins sur les bords de la géométrie. Les pixels multiéchantillonnés exigent davantage de mémoire et de traitement que les pixels à échantillon unique, c’est pourquoi un schéma de compression des couleurs est implémenté. La compression des couleurs est un schéma sans perte, par pixel, dont l’objectif est d’économiser de la bande passante mémoire et de réduire le nombre de cycles d’horloge nécessaires pour traiter un pixel multiéchantillonné. En 8xMSAA (8 échantillons par pixel), chaque pixel peut nécessiter 8 fois la bande passante mémoire et 8 fois la puissance de traitement d’un simple pixel à échantillon unique. En règle générale, les échantillons d’un pixel sont très redondants et ne contiennent qu’une ou deux valeurs de couleur uniques. Il est rare que tous les échantillons d’un pixel 8xMSAA aient 8 valeurs uniques. Une forte disparité entre les échantillons n’est pas impossible : elle peut se produire dans une scène comportant une géométrie finement tessellée, ou simplement par hasard. L’objectif du schéma de compression est de tirer parti de la redondance des échantillons dans une scène typique.

Schéma de compression des couleurs

Pour compresser un pixel MSAA, on tire parti de la redondance en ne stockant chaque couleur unique qu’une seule fois. Par exemple, en 8xMSAA, les 8 échantillons peuvent ressembler aux couleurs du tableau suivant. Il n’y a que trois couleurs uniques, mais elles occupent actuellement l’espace de 8. Trois couleurs uniques occupant l'espace de huit Le niveau de compression le plus bas, appelé compression FMask, élimine cette redondance en attribuant un pointeur à chaque échantillon d’un pixel. Ce pointeur indique au schéma de compression quel échantillon contient la couleur réelle de cet échantillon. Un pointeur 8xMSAA ne fait que 3 bits, tandis que ceux du 4xMSAA et du 2xMSAA font respectivement 2 et 1 bits. Comme le montre le tableau précédent, cela réduit la quantité de données de couleur nécessaires. Comme il doit toujours être possible d’avoir un pixel comportant le nombre maximal de couleurs d’échantillons uniques, le schéma de compression ne réduit pas l’empreinte mémoire. Il permet en revanche d’économiser de la bande passante mémoire en ne lisant/écrivant que les emplacements d’échantillons désignés par au moins un pointeur FMask. Dans le tableau précédent, nous sommes passés de la lecture/écriture de 8 couleurs à la lecture/écriture de 3 couleurs seulement. De plus, toutes les opérations du bloc de couleur (comme le mélange ou les ROP) ne portent que sur 3 couleurs au lieu de 8, comme le montrent les tableaux suivants. Mémoire FMask et mémoire de couleur Le schéma de compression implémente également un niveau de compression supérieur appelé compression CMask. Dans le tableau précédent, même si nous économisons de la bande passante grâce à la réduction des données de couleur, nous devons toujours lire 8 pointeurs FMask par pixel. La compression CMask économise de la bande passante mémoire en réduisant la quantité de données de pointeurs lues. Dans le cas courant, il n’y a que 1 ou 2 pointeurs uniques. Le CMask est une valeur de quatre bits qui encode les régions effacées rapidement et le nombre de plans de bits à charger pour une tuile donnée. Il y a 1 bit de données d’effacement rapide par région. Une valeur de 0 signifie que la région est effacée rapidement. Un encodage sur deux bits indique le nombre de plans de bits à charger pour une tuile donnée, comme le montre le tableau suivant. Plans de bits CMask

Anticrénelage de qualité améliorée (EQAA)

L’anticrénelage de qualité améliorée (EQAA) est une compression avec perte pour l’anticrénelage. Il s’agit d’une extension de l’algorithme de compression des couleurs sans perte. Le stockage des couleurs est réduit, de sorte qu’il n’y a pas assez d’espace pour stocker une couleur unique par échantillon. La plupart du temps, un pixel ne comporte qu’un petit nombre de couleurs uniques. FMask peut les mapper de façon à couvrir l’ensemble du pixel. Pour l’EQAA, le bloc de couleur prend en charge jusqu’à 16 échantillons. Le bloc de couleur ne prend pas en charge 16 échantillons pour le MSAA normal en raison de l’empreinte mémoire excessive. Le bloc de couleur ne tente pas de deviner ni d’interpoler les couleurs. Lorsqu’il ne peut pas déterminer quelle doit être une couleur ou qu’il ne peut pas se permettre de la stocker, il marque l’échantillon correspondant comme inconnu dans FMask. Le rendu EQAA s’effectue comme en MSAA, mais avec la limitation que seul un certain nombre d’échantillons sont corrects. Le nombre d’échantillons par surface est limité.

Compatibilité des fonctionnalités

Le tableau suivant présente les combinaisons d’opérations autorisées dans le bloc de couleur. Combinaisons d'opérations autorisées dans le bloc de couleur

API de compression des couleurs

MSAA, EQAA, FMask et CMask sont référencés par plusieurs API, structures et énumérations. La bibliothèque XG fournit une disposition pour les paramètres FMask et CMask. Pour plus d’informations, consultez ID3D12Device::CreateComponentPlacedResourceX. Notez que les appels à ID3D12GraphicsCommandList::RSSetMSAAParametersX ou à ID3D12GraphicsCommandList1::SetSamplePositions doivent inclure des paramètres d’état MSAA complets. Notez également que les fonctions intrinsèques du langage HLSL (High-Level Shader Language) permettant d’obtenir le nombre d’échantillons et les positions des échantillons renvoient des positions d’échantillons incorrectes lorsque ces API sont utilisées. Pour plus d’informations, consultez les champs et les remarques des structures et énumérations suivantes :

Performances et débogage

L’outil PIX comporte plusieurs tests spécifiques aux performances du MSAA. Pour plus d’informations, consultez Dr. PIX. De nombreux compteurs, à commencer par CB_PERF_SEL_CM_FC_TILE_VALID_READY, font référence aux opérations FMask et CMask. Pour plus d’informations, consultez Tableau des compteurs matériels PIX.

Voir aussi

Décodage CMask
Last modified on October 6, 2026