Partager via


Rastérisation conservatrice Direct3D 12

La rastérisation conservatrice ajoute une certaine certitude au rendu de pixels, ce qui est utile en particulier pour les algorithmes de détection de collision.

Aperçu

La rastérisation conservatrice signifie que tous les pixels qui sont au moins partiellement couverts par une primitive rendue sont ratérisés, ce qui signifie que le nuanceur de pixels est appelé. Le comportement normal est l’échantillonnage, qui n’est pas utilisé si la rastérisation conservatrice est activée.

La rastérisation conservatrice est utile dans un certain nombre de situations, notamment pour la certitude dans la détection de collision, le culage d’occlusion et le rendu en mosaïque.

Par exemple, la figure suivante montre un triangle vert rendu à l’aide de la rastérisation conservatrice, tel qu’il apparaît dans le rastériseur (autrement dit, à l’aide de 16,8 coordonnées de vertex à point fixe). La zone brune est connue sous le nom de « région d’incertitude » : une région conceptuelle qui représente les limites étendues du triangle, nécessaire pour garantir que la primitive dans le rastériseur est conservatrice par rapport aux coordonnées de vertex à virgule flottante d’origine. Les carrés rouges à chaque sommet montrent comment la région d’incertitude est calculée : comme un carré balayé.

Les grands carrés gris affichent les pixels qui seront rendus. Les carrés roses affichent les pixels rendus à l’aide de la « règleTop-Left », qui entre en jeu en tant que bord du triangle traverse le bord des pixels. Il peut y avoir des faux positifs (pixels définis qui n’ont pas dû être) que le système va normalement, mais pas toujours cull.

la règle supérieure gauche

Interactions avec le pipeline

Interaction des règles de rastérisation

En mode rastérisation conservatrice, les règles de rastérisation s’appliquent de la même façon que lorsque le mode rastérisation conservateur n’est pas activé avec des exceptions pour la règle Top-Left, décrite ci-dessus et la couverture des pixels. 16.8 Fixed-Point précision ratériseur doit être utilisée.

Les pixels qui ne seraient pas couverts si le matériel utilisait des coordonnées de vertex à virgule flottante complète ne peut être inclus que s’ils se trouvent dans une région d’incertitude sans plus grand demi-pixel dans le domaine de point fixe. Le matériel futur devrait atteindre la région d’incertitude renforcée spécifiée dans le niveau 2. Notez que cette exigence empêche les triangles sliver de s’étendre plus loin que nécessaire.

Une région d’incertitude valide similaire s’applique également à InnerCoverage, mais elle est plus étroite, car aucune mise en œuvre n’exige une région d’incertitude plus importante pour ce cas. Pour plus d’informations, consultez interaction InnerCoverage.

Les régions d’incertitude interne et externe doivent être supérieures ou égales à la taille de la moitié de la grille de sous-pixels, ou 1/512 d’un pixel, dans le domaine de point fixe. Il s’agit de la région d’incertitude minimale valide. 1/512 provient de la représentation de coordonnées ratériseur de point fixe de 16,8 et de la règle arrondie à la plus proche qui s’applique lors de la conversion des coordonnées de vertex à virgule flottante en coordonnées de point fixe 16,8. 1/512 peut changer si la précision du rastériseur change. Si une implémentation implémente cette région d’incertitude minimale, elle doit suivre la règle de Top-Left lorsqu’un bord ou un coin de la région d’incertitude tombe le long du bord ou de l’angle d’un pixel. Les bords coupés de la région d’incertitude doivent être traités comme le sommet le plus proche, ce qui signifie qu’il compte comme deux bords : les deux qui se joignent au sommet associé. Top-Left règle est requise lorsque la région d’incertitude minimale est utilisée, car si ce n’est pas le cas, une implémentation de rastérisation conservatrice ne parvient pas à rastériser les pixels qui peuvent être couverts lorsque le mode rastérisation conservateur est désactivé.

Le diagramme suivant illustre une région d’incertitude externe valide produite par le balayage d’un carré autour des bords de la primitive dans le domaine de point fixe (c’est-à-dire que les sommets ont été quantifiés par la représentation à virgule fixe de 16,8). Les dimensions de ce carré sont basées sur la taille de la région d’incertitude extérieure valide : pour les 1/2 d’un pixel, le carré est de 1 pixel de largeur et de hauteur, pour 1/512 d’un pixel, le carré est de 1/256 d’un pixel en largeur et hauteur. Le triangle vert représente une primitive donnée, la ligne en pointillé rouge représente la limite sur la rastérisation conservatrice sur overestimée, les carrés noirs solides représentent le carré qui est balayé le long des bords primitifs, et la zone bleue checkered est la région d’incertitude extérieure :

région d’incertitude extérieure.

Interaction multi-échantillonnage

Quel que soit le nombre d’échantillons dans RenderTarget/DepthStencil surfaces (ou si ForcedSampleCount est utilisé ou non), tous les exemples sont couverts pour les pixels ratérisés par la rastérisation conservatrice. Les échantillons individuels ne sont pas testés pour déterminer s’ils tombent dans la primitive ou non.

Interaction sampleMask

L'SampleMask l’état ratériseur s’applique de la même façon que lorsque la rastérisation conservatrice n’est pas activée pour InputCoverage, mais n’affecte pas InnerCoverage (c’est-à-dire qu’il n’est pas and’ed dans une entrée déclarée avec InnerCoverage). Cela est dû au fait que InnerCoverage n’est pas lié au fait que les échantillons MSAA sont masqués : 0 InnerCoverage signifie uniquement que le pixel n’est pas garanti pour être entièrement couvert, et non qu’aucun échantillon ne sera mis à jour.

Interaction de test de profondeur/gabarit

Les tests de profondeur/gabarit continuent pour un pixel ratérisé de manière conservatrice de la même façon que si tous les échantillons sont couverts lorsque la rastérisation conservatrice n’est pas activée.

La poursuite de tous les échantillons couverts peut entraîner une extrapolation de profondeur, qui est valide et doit être limitée à la fenêtre d’affichage, comme spécifié lorsque la rastérisation conservatrice n’est pas activée. Cela est similaire au moment où les modes d’interpolation de fréquence des pixels sont utilisés sur un RenderTarget avec un nombre d’échantillons supérieur à 1, bien que dans le cas de la rastérisation conservatrice, il s’agit de la valeur de profondeur entrant dans le test de profondeur de fonction fixe qui peut être extrap isolé.

Le comportement de culling de profondeur précoce avec l’extrapolation de profondeur n’est pas défini. Cela est dû au fait que certains matériels de fin de profondeur précoce ne peuvent pas prendre correctement en charge les valeurs de profondeur extrap isolés. Toutefois, le comportement de suppression de profondeur précoce en présence de l’extrapolation de profondeur est problématique même avec le matériel qui peut prendre en charge les valeurs de profondeur extrap isolés. Ce problème peut être résolu en limitant la profondeur d’entrée du nuanceur de pixels aux valeurs de profondeur minimale et maximale de la primitive en cours de rastérisation et en écrivant cette valeur dans oDepth (registre de profondeur de sortie du nuanceur de pixels). Les implémentations sont requises pour désactiver le culling de profondeur anticipée dans ce cas, en raison de l’écriture oDepth.

Interaction de pixel d’assistance

Les règles de pixel d’assistance s’appliquent de la même façon que lorsque la rastérisation conservatrice n’est pas activée. Dans ce cadre, tous les pixels, y compris les pixels d’assistance, doivent signaler InputCoverage exactement comme spécifié dans la section d’interaction InputCoverage. Ainsi, les pixels entièrement non couverts rapportent 0 couverture.

Interaction de couverture de sortie

La couverture de sortie (oMask) se comporte pour un pixel ratérisé de manière conservatrice, car il le fait lorsque la rastérisation conservatrice n’est pas activée avec tous les échantillons couverts.

Interaction inputCoverage

En mode rastérisation conservatrice, ce registre d’entrée est rempli comme si tous les échantillons sont couverts lorsque la rastérisation conservatrice n’est pas activée pour un pixel ratérisé de manière conservatrice donnée. Autrement dit, toutes les interactions existantes s’appliquent (par exemple, SampleMask est appliqué), et les premiers n bits de InputCoverage de l’objet LSB sont définis sur 1 pour un pixel ratérisé de manière conservatrice, compte tenu d’un n échantillon par pixel RenderTarget et/ou depthStencil tampon lié au fusion de sortie, ou d’un exemple n ForcedSampleCount. Le reste des bits est 0.

Cette entrée est disponible dans un nuanceur indépendamment de l’utilisation de la rastérisation conservatrice, bien que la rastérisation conservatrice change son comportement pour afficher uniquement tous les exemples couverts (ou aucun pour Helper Pixels).

Interaction InnerCoverage

Cette fonctionnalité est requise et disponible uniquement dans le niveau 3. Le runtime échouera la création du nuanceur pour les nuanceurs qui utilisent ce mode lorsqu’une implémentation prend en charge un niveau inférieur au niveau 3.

Le nuanceur de pixels a un entier scalaire 32 bits disponible : InnerCoverage. Il s’agit d’un champ de bits dont le bit 0 est défini sur 1 pour un pixel ratérisé de manière conservatrice, uniquement lorsque ce pixel est garanti entièrement à l’intérieur de la primitive actuelle. Tous les autres bits du registre d’entrée doivent être définis sur 0 lorsque le bit 0 n’est pas défini, mais ne sont pas définis lorsque le bit 0 est défini sur 1 (essentiellement, ce champ de bits représente une valeur booléenne où false doit être exactement 0, mais true peut être n’importe quelle valeur impaire (c.-à-d. bit 0 set) non nulle). Cette entrée est utilisée pour des informations de rastérisation conservatrice sous-estimées. Il informe le nuanceur de pixels si le pixel actuel se trouve complètement à l’intérieur de la géométrie.

Cela doit tenir compte de l’erreur d’alignement sur les résolutions supérieures ou égales à la résolution à laquelle le dessin actuel fonctionne. Il ne doit pas y avoir de faux positifs (définir InnerCoverage bits lorsque le pixel n’est pas entièrement couvert pour toute erreur d’alignement aux résolutions supérieures ou égales à la résolution à laquelle le dessin actuel fonctionne), mais les faux négatifs sont autorisés. En résumé, l’implémentation ne doit pas identifier de manière incorrecte les pixels comme étant entièrement couverts qui ne seraient pas avec des coordonnées de vertex à virgule flottante complètes dans le Rasterizer.

Les pixels qui seraient entièrement couverts si le matériel utilisait des coordonnées de vertex à virgule flottante complète ne peut être omis que s’ils croisent la région d’incertitude interne, qui ne doit pas être supérieure à la taille de la grille de sous-pixels, ou 1/256 d’un pixel, dans le domaine de point fixe. Autrement dit, les pixels entièrement situés dans la limite intérieure de la région d’incertitude intérieure doivent être marqués comme entièrement couverts. La limite interne de la région d’incertitude est illustrée dans le diagramme ci-dessous par la ligne en pointillé noir gras. 1/256 provient de la représentation de coordonnées ratériseur à virgule fixe de 16,8, qui peut changer si la précision du rastériseur change. Cette région d’incertitude suffit pour tenir compte de l’erreur d’alignement provoquée par la conversion des coordonnées de vertex à virgule flottante en coordonnées de vertex de point fixe dans le Rasterizer.

Les mêmes exigences minimales en région d’incertitude 1/512 définies dans l’interaction des règles de rastérisation s’appliquent également ici.

Le diagramme suivant illustre une région d’incertitude interne valide produite par le balayage d’un carré autour des bords de la primitive dans le domaine de point fixe (c’est-à-dire que les sommets ont été quantifiés par la représentation à virgule fixe de 16,8). Les dimensions de ce carré sont basées sur la taille valide de la région d’incertitude intérieure : pour 1/256 d’un pixel, le carré est de 1/128 d’un pixel de largeur et de hauteur. Le triangle vert représente une primitive donnée, la ligne en pointillé noir gras représente la limite de la région d’incertitude intérieure, les carrés noirs solides représentent le carré qui est balayé le long des bords primitifs, et la zone de contrôle orange est la région d’incertitude interne :

l’incertitude intérieure reqion.

L’utilisation de InnerCoverage n’affecte pas si un pixel est de manière conservatrice ratérisée, c’est-à-dire si l’utilisation de l’un de ces modes InputCoverage n’affecte pas les pixels qui sont ratérisés lorsque le mode rastérisation conservateur est activé. Par conséquent, lorsque InnerCoverage est utilisé et que le nuanceur de pixels traite un pixel qui n’est pas complètement couvert par la géométrie, sa valeur est 0, mais l’appel du nuanceur de pixels aura des exemples mis à jour. Cela diffère du moment où InputCoverage est 0, ce qui signifie qu’aucun échantillon n’est mis à jour.

Cette entrée s’exclue mutuellement avec InputCoverage : les deux ne peuvent pas être utilisées.

Pour accéder à InnerCoverage, il doit être déclaré en tant que composant unique de l’un des registres d’entrée du nuanceur de pixels. Le mode d’interpolation de la déclaration doit être constant (l’interpolation ne s’applique pas).

Le champ de bits InnerCoverage n’est pas affecté par les tests de profondeur/gabarit, ni anded avec l’état SampleMask Rasterizer.

Cette entrée est valide uniquement en mode rastérisation conservateur. Lorsque la rastérisation conservatrice n’est pas activée, InnerCoverage produit une valeur non définie.

Les appels de nuanceur de pixels provoqués par la nécessité de Pixels Helper, mais sinon non couverts par la primitive, doivent avoir le registre InnerCoverage défini sur 0.

Interaction d’interpolation d’attribut

Les modes d’interpolation d’attribut sont inchangés et continuent de la même façon que lorsque la rastérisation conservatrice n’est pas activée, où les sommets convertis à l’échelle de la fenêtre d’affichage et de point fixe sont utilisés. Étant donné que tous les échantillons d’un pixel ratérisé de manière conservatrice sont considérés comme couverts, il est valide pour que les valeurs soient extrapisées, comme lorsque les modes d’interpolation de fréquence de pixels sont utilisés sur un RenderTarget avec le nombre d’échantillons supérieur à 1. Les modes d’interpolation centroïde produisent des résultats identiques au mode d’interpolation non centroïde correspondant ; la notion de centroïde est sans signification dans ce scénario , où l’échantillon de couverture n’est que complet ou 0.

La rastérisation conservatrice permet aux triangles dégénérés de produire des appels de nuanceur de pixels. Par conséquent, les triangles dégénérés doivent utiliser les valeurs affectées au sommet 0 pour toutes les valeurs interpolées.

Interaction de découpage

Lorsque le mode rastérisation conservateur est activé et que le clip de profondeur est désactivé (lorsque le DepthClipEnable l’état ratériseur a la valeur FALSE), il peut y avoir des écarts dans l’interpolation d’attributs pour les segments d’une primitive qui se situent en dehors du 0 <= z <= plage w, selon l’implémentation : les valeurs constantes sont utilisées à partir d’un point où la primitive croise le plan approprié (proche ou loin), ou l’interpolation d’attribut se comporte comme lorsque le mode rastérisation conservateur est désactivé. Toutefois, le comportement de la valeur de profondeur est le même, quel que soit le mode de rastérisation conservateur, c’est-à-dire les primitives qui se trouvent en dehors de la plage de profondeur doivent toujours avoir la valeur de la limite la plus proche de la plage de profondeur de la fenêtre d’affichage. Le comportement d’interpolation d’attribut à l’intérieur du <= z <= plage w doit rester inchangé.

Interaction avec la distance du clip

La distance de clip est valide lorsque le mode rastérisation conservateur est activé et se comporte pour un pixel ratérisé de manière conservatrice, car il le fait lorsque la rastérisation conservatrice n’est pas activée avec tous les exemples couverts.

Notez que la rastérisation conservatrice peut entraîner l’extrapolation de la coordonnée de vertex W, ce qui peut entraîner W <= 0. Cela peut entraîner l’utilisation d’implémentations de distance par pixel sur une distance clip qui a été divisée par une valeur W non valide. Les implémentations clip distance doivent se protéger contre l’appel de rastérisation pour les pixels où les coordonnées de vertex W <= 0 (par exemple, en raison d’une extrapolation en mode ratérisation conservateur).

Interaction de rastérisation indépendante cible

Le mode rastérisation conservateur est compatible avec la rastérisation indépendante cible (TIR). Les règles et restrictions TIR s’appliquent, se comportent pour un pixel rastérisé de manière conservatrice, comme si tous les échantillons sont couverts.

Interaction de topologie primitive IA

La rastérisation conservatrice n’est pas définie pour les primitives de trait ou de point. Par conséquent, les topologies primitives qui spécifient des points ou des lignes produisent un comportement non défini s’ils sont alimentés à l’unité de rastériseur lorsque la rastérisation conservatrice est activée.

La validation de la couche de débogage vérifie que les applications n’utilisent pas ces topologies primitives.

Interaction de requête

Pour un pixel ratérisé de manière conservatrice, les requêtes se comportent comme elles le font lorsque la rastérisation conservatrice n’est pas activée lorsque tous les échantillons sont couverts. Par exemple, pour un pixel rastérisé de manière conservatrice, D3D12_QUERY_TYPE_OCCLUSION et D3D12_QUERY_TYPE_PIPELINE_STATISTICS (de D3D12_QUERY_TYPE) doivent se comporter comme ils le feraient lorsque la rastérisation conservatrice n’est pas activée lorsque tous les échantillons sont couverts.

Les appels de nuanceur de pixels doivent être incrémentés pour chaque pixel rastérisé de manière conservatrice en mode rastérisation conservateur.

Interaction avec l’état de la coupure

Tous les États de cull sont valides en mode rastérisation conservatrice et suivent les mêmes règles que lorsque la rastérisation conservatrice n’est pas activée.

Lors de la comparaison de la rastérisation conservatrice entre les résolutions à elle-même ou sans ratérisation conservatrice activée, il est possible que certaines primitives aient un face-à-face incompatible (c’est-à-dire une face arrière, l’autre face avant). Les applications peuvent éviter cette incertitude en utilisant D3D12_CULL_MODE_NONE (de D3D12_CULL_MODE) et non en utilisant la valeur générée par le système IsFrontFace.

Interaction IsFrontFace

La valeur générée par le système IsFrontFace est valide pour être utilisée en mode rastérisation conservatrice et suit le comportement défini lorsque la rastérisation conservatrice n’est pas activée.

Interaction des modes de remplissage

La seule D3D12_FILL_MODE valide pour la rastérisation conservatrice est D3D12_FILL_SOLID, tout autre mode de remplissage est un paramètre non valide pour l’état ratériseur.

Cela est dû au fait que la spécification fonctionnelle D3D12 spécifie que le mode de remplissage filaire doit convertir les bords triangles en lignes et suivre les règles de rastérisation de ligne et le comportement de rastérisation de ligne conservateur n’a pas été défini.

Détails de l’implémentation

Le type de rastérisation pris en charge dans Direct3D 12 est parfois appelé « Rastérisation conservatrice surestimée ». Il existe également le concept de « rastérisation conservatrice sous-estimée », ce qui signifie que seuls les pixels entièrement couverts par une primitive rendue sont rastérisés. Les informations de rastérisation conservatrice sous-estimées sont disponibles via le nuanceur de pixels par le biais de l’utilisation de données de couverture d’entrée, et seule la rastérisation conservatrice surestimée est disponible en mode de rastérisation.

Si une partie d’une primitive chevauche un pixel, ce pixel est considéré comme couvert, puis ratérisé. Lorsqu’un bord ou un angle d’une primitive tombe le long du bord ou de l’angle d’un pixel, l’application de la « règle en haut à gauche » est spécifique à l’implémentation. Toutefois, pour les implémentations qui prennent en charge les triangles dégénérés, un triangle dégénéré le long d’un bord ou d’un angle doit couvrir au moins un pixel.

Les implémentations de rastérisation conservatrices peuvent varier sur différents matériels et produire des faux positifs, ce qui signifie qu’elles peuvent décider incorrectement que les pixels sont couverts. Cela peut se produire en raison de détails spécifiques à l’implémentation, tels que la croissance primitive ou l’alignement d’erreurs inhérentes aux coordonnées de vertex à point fixe utilisées dans la rastérisation. La raison pour laquelle les faux positifs (par rapport aux coordonnées de vertex à point fixe) sont valides, car une quantité de faux positifs est nécessaire pour permettre une implémentation d’effectuer une évaluation de couverture par rapport aux sommets post-alignés (c’est-à-dire les coordonnées de vertex qui ont été converties de virgule flottante au point fixe 16,8 utilisé dans le rastériseur), mais respectez la couverture produite par les coordonnées de vertex à virgule flottante d’origine.

Les implémentations de rastérisation conservatrices ne produisent pas de faux négatifs par rapport aux coordonnées de vertex à virgule flottante pour les primitives post-alignement non dégénérées : si une partie d’une primitive chevauche une partie d’un pixel, ce pixel est ratérisé.

Triangles dégénérés (indices dupliqués dans une mémoire tampon d’index ou colline en 3D) ou deviennent dégénérés après la conversion à point fixe (sommets collineaires dans le rastériseur), peuvent ou ne pas être abattus ; les deux sont des comportements valides. Les triangles dégénérés doivent être considérés comme étant orientés vers l’arrière. Par conséquent, si un comportement spécifique est requis par une application, il peut utiliser le culage back-face ou le test pour l’avant. Les triangles dégénérés utilisent les valeurs attribuées au sommet 0 pour toutes les valeurs interpolées.

Il existe trois niveaux de prise en charge matérielle, en plus de la possibilité que le matériel ne prend pas en charge cette fonctionnalité.

  • Le niveau 1 applique une région d’incertitude maximale de 1/2 pixels et ne prend pas en charge les dégénérés post-alignement. Cela est utile pour le rendu en mosaïque, un atlas de texture, une génération de carte légère et des cartes d’ombre de sous-pixels.
  • Le niveau 2 réduit la région d’incertitude maximale à 1/256 et nécessite que les dégénérés post-alignement ne soient pas abattus. Ce niveau est utile pour l’accélération de l’algorithme basé sur le processeur (par exemple, voxelization).
  • Le niveau 3 conserve une région d’incertitude maximale de 1/256 et ajoute la prise en charge de la couverture interne des entrées. La couverture d’entrée interne ajoute la nouvelle valeur SV_InnerCoverage au langage hlSL (High Level Shading Language). Il s’agit d’un entier scalaire 32 bits qui peut être spécifié lors de l’entrée dans un nuanceur de pixels et représente les informations de rastérisation conservatrice sous-estimées (autrement dit, si un pixel est garanti -to-be-entièrement couvert). Ce niveau est utile pour l’occlusion culling.

Résumé de l’API

Les méthodes, structures, énumérations et classes d’assistance suivantes font référence à la rastérisation conservatrice :

didacticiels vidéo sur l’apprentissage avancé DirectX : Ratérisation conservatrice

vues triées ratériseur

de rendu