Rastérisation conservatrice direct3D 12

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

Vue d’ensemble

La rastérisation conservatrice signifie que tous les pixels qui sont au moins partiellement couverts par une primitive rendue sont rasté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 sécurité dans la détection de collision, l’élimination de l’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 (c’est-à-dire, en utilisant des coordonnées de sommet fixes 16,8). 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, requise 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 de chaque sommet montrent comment la région d’incertitude est calculée : sous la forme d’un carré balayé.

Les grands carrés gris affichent les pixels qui seront affichés. Les carrés roses affichent les pixels affichés à l’aide de la « règle du haut à gauche », qui entre en jeu lorsque le bord du triangle traverse le bord des pixels. Il peut y avoir des faux positifs (pixels définis qui n’auraient pas dû être) que le système va normalement, mais pas toujours éliminer.

règle en haut à gauche

Interactions avec le pipeline

Interaction des règles de rastérisation

En mode rastérisation conservateur, 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 de Top-Left décrite ci-dessus et la couverture en pixels. 16,8 Fixed-Point précision du rasté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 peuvent être inclus que s’ils se trouvent dans une zone d’incertitude pas plus grande d’un demi-pixel dans le domaine à virgule 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 que nécessaire.

Une région d’incertitude valide similaire s’applique également à InnerCoverage , mais elle est plus stricte, car aucune implémentation ne nécessite une zone d’incertitude plus grande pour ce cas. Pour plus d’informations, consultez Interaction InnerCoverage .

Les zones 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 à virgule fixe. Il s’agit de la région d’incertitude minimale valide. 1/512 provient de la représentation de coordonnées de rastériseur à 16,8 points fixes et de la règle d’arrondi à 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 zone d’incertitude minimale, elle doit suivre la règle de Top-Left lorsqu’un bord ou un coin de la zone d’incertitude tombe le long du bord ou du coin 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 arêtes : 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 pourraient être couverts lorsque le mode de rastérisation conservatrice 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 de 16,8 points fixes). Les dimensions de ce carré sont basées sur la taille de la région d’incertitude externe valide : pour le 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 1/256 d’un pixel en largeur et en hauteur. Le triangle vert représente une primitive donnée, la ligne en pointillés rouges représente la limite sur la rastérisation conservatrice surestimée, les carrés noirs solides représentent le carré balayé le long des bords primitifs, et la zone bleue à damons est la zone d’incertitude externe :

région d’incertitude externe.

Interaction multi-échantillonnage

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

Interaction SampleMask

L’état du rastériseur SampleMask s’applique de la même façon que lorsque la rastérisation conservatrice n’est pas activée pour InputCoverage, mais n’affecte InnerCoverage pas (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 exemples MSAA sont masqués : 0 InnerCoverage signifie uniquement que le pixel n’est pas entièrement couvert, pas qu’aucun échantillon ne sera mis à jour.

Interaction de test de profondeur/gabarit

Le test de profondeur/gabarit se poursuit pour un pixel rastérisé de la même façon que si tous les échantillons sont couverts lorsque la rastérisation conservatrice n’est pas activée.

L’exécution 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 à lorsque les modes d’interpolation de fréquence de 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, c’est la valeur de profondeur entrant dans le test de profondeur de fonction fixe qui peut être extrapolée.

Le comportement d’élimination de profondeur précoce avec l’extrapolation de profondeur n’est pas défini. En effet, certains matériels d’élimination de profondeur précoce ne peuvent pas prendre correctement en charge les valeurs de profondeur extrapolées. Toutefois, le comportement d’élimination des profondeurs précoces en présence de l’extrapolation de profondeur est problématique, même avec du matériel qui peut prendre en charge les valeurs de profondeur extrapolées. Ce problème peut être contourné 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 oDepth dans (registre de profondeur de sortie du nuanceur de pixels). Des implémentations sont nécessaires pour désactiver l’élimination de profondeur précoce dans ce cas, en raison de l’écriture oDepth .

Interaction du 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 avec précision, comme spécifié dans la section d’interaction InputCoverage . Ainsi, les pixels entièrement non couverts signalent une couverture 0.

Interaction de la couverture de sortie

La couverture de sortie (oMask) se comporte pour un pixel rastérisé de manière conservatrice, comme c’est le cas lorsque la rastérisation conservatrice n’est pas activée avec tous les exemples 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 rastérisé de manière conservatrice. Autrement dit, toutes les interactions existantes s’appliquent (par exemple , SampleMask est appliqué) et les n premiers bits InputCoverage du LSB sont définis sur 1 pour un pixel rastérisé de manière conservatrice, étant donné un n échantillon par pixel RenderTarget et/ou depthStencil tampon lié à la fusion de sortie, ou un n exemple ForcedSampleCount. Le reste des bits est 0.

Cette entrée est disponible dans un nuanceur quelle que soit l’utilisation de la rastérisation conservatrice, bien que la rastérisation conservatrice change son comportement pour afficher uniquement tous les échantillons couverts (ou aucun pour les pixels d’assistance).

Interaction InnerCoverage

Cette fonctionnalité est requise par et disponible uniquement dans le niveau 3. Le runtime échoue à 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 une valeur de génération système d’entier scalaire 32 bits disponible : InnerCoverage. Il s’agit d’un champ de bits qui a le bit 0 du LSB défini sur 1 pour un pixel rastérisé de manière conservatrice, uniquement lorsque ce pixel est garanti qu’il se trouve entièrement à l’intérieur de la primitive actuelle. Tous les autres bits du registre d’entrée doivent avoir la valeur 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’est-à-dire, bit 0 set) non nulle). Cette entrée est utilisée pour les informations sous-estimées sur la rastérisation conservatrice. Il indique au 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 aux résolutions supérieures ou égales à la résolution à laquelle le dessin actuel fonctionne. Il ne doit pas y avoir de faux positifs (définition InnerCoverage de bits lorsque le pixel n’est pas entièrement couvert pour toute erreur d’alignement à des 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 entièrement couverts qui ne seraient pas avec des coordonnées de vertex à virgule flottante complètes dans le rastériseur.

Les pixels qui seraient entièrement couverts si le matériel utilisait des coordonnées de vertex à virgule flottante complète ne peuvent être omis que s’ils croisent la zone 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 à l’intérieur de la limite interne de la zone d’incertitude interne 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és noirs en gras. 1/256 provient de la représentation de coordonnées rasterizer à point fixe 16,8, qui peut changer si la précision du rastériseur change. Cette région d’incertitude est suffisante pour tenir compte de l’erreur d’alignement provoquée par la conversion de coordonnées de vertex à virgule flottante en coordonnées de vertex à point fixe dans le rastériseur.

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

Le diagramme suivant illustre une zone 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 de 16,8 points fixes). Les dimensions de ce carré sont basées sur la taille de la région d’incertitude interne valide : pour 1/256 d’un pixel, le carré est de 1/128 d’un pixel en largeur et en hauteur. Le triangle vert représente une primitive donnée, la ligne en pointillés noirs gras représente la limite de la région d’incertitude interne, les carrés noirs solides représentent le carré balayé le long des bords primitifs, et la zone orange à damage est la zone d’incertitude interne :

reqion d’incertitude interne.

L’utilisation de InnerCoverage n’affecte pas si un pixel est rastérisé de manière conservatrice, c’est-à-dire que l’utilisation de l’un de ces InputCoverage modes n’affecte pas les pixels qui sont rastérisés lorsque le mode rastérisation conservatrice 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 sera 0, mais l’appel du nuanceur de pixels aura des exemples mis à jour. Cela diffère de la valeur InputCoverage 0, ce qui signifie qu’aucun échantillon ne sera mis à jour.

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

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 sur la déclaration doit être constant (l’interpolation ne s’applique pas).

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

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

Les appels du nuanceur de pixels provoqués par la nécessité de pixels d’assistance, mais qui, dans le cas contraire, ne sont pas couverts par la primitive, doivent avoir le InnerCoverage registre défini sur 0.

Interaction d’interpolation d’attribut

Les modes d’interpolation d’attribut sont inchangés et se déroulent de la même façon que lorsque la rastérisation conservatrice n’est pas activée, où les sommets à l’échelle de la fenêtre d’affichage et convertis en point fixe sont utilisés. Étant donné que tous les échantillons d’un pixel rastérisé de manière conservatrice sont considérés comme couverts, il est valide que les valeurs soient extrapolées, comme lorsque les modes d’interpolation de fréquence de pixel sont utilisés sur un RenderTarget avec un 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 n’a aucun sens dans ce scénario , où la couverture de l’échantillon est uniquement complète 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 à Vertex 0 pour toutes les valeurs interpolées.

Interaction de découpage

Lorsque le mode rastérisation conservatrice est activé et que le découpage de profondeur est désactivé (lorsque l’état du rastériseur DepthClipEnable est défini sur FALSE), il peut y avoir des variances dans l’interpolation d’attribut pour les segments d’une primitive qui se trouvent en dehors de la plage 0 <= z <= w, selon l’implémentation : les valeurs constantes sont utilisées à partir d’un point où la primitive croise le plan approprié (proche ou lointain), 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 que les primitives qui se trouvent en dehors de la plage de profondeur doivent toujours recevoir 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 de la plage 0 <= z <= w doit rester inchangé.

Interaction de distance du clip

La distance de découpage est valide lorsque le mode rastérisation conservatrice est activé et se comporte pour un pixel rastérisé de manière conservatrice, comme 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 une extrapolation de la coordonnée de vertex W, ce qui peut entraîner W <= 0. Cela peut entraîner le fonctionnement des implémentations de distance de clip par pixel sur une distance de clip qui a été divisée en perspective par une valeur W non valide. Les implémentations de distance de découpage doivent éviter d’appeler la rastérisation pour les pixels où la coordonnée de vertex W <= 0 (par exemple, en raison d’une extrapolation en mode rastérisation conservatrice).

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, en se comportant 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 ligne ou de point. Par conséquent, les topologies primitives qui spécifient des points ou des lignes produisent un comportement non défini si elles sont transmises à 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 rasté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 exemples sont couverts. Par exemple, pour un pixel rastérisé de manière conservatrice, D3D12_QUERY_TYPE_OCCLUSION et D3D12_QUERY_TYPE_PIPELINE_STATISTICS (à partir 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 du nuanceur de pixels doivent s’incrémenter pour chaque pixel rastérisé de manière conservatrice en mode rastérisation conservatrice.

Interaction de l’état de coupe

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

Lorsque l’on compare la rastérisation conservatrice des résolutions à elle-même ou sans que la rastérisation conservatrice soit activée, il est possible que certaines primitives aient une face incompatible (c.-à-d. une face arrière, l’autre face avant). Les applications peuvent éviter cette incertitude en utilisant D3D12_CULL_MODE_NONE (à partir de D3D12_CULL_MODE) et non à l’aide de la valeur générée par le IsFrontFace système.

Interaction IsFrontFace

La IsFrontFace valeur générée par le système 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

Le seul D3D12_FILL_MODE valide pour la rastérisation conservatrice est D3D12_FILL_SOLID, tout autre mode de remplissage n’est pas un paramètre non valide pour l’état rastériseur.

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

Informations d’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 grâce à l’utilisation des données de couverture d’entrée, et seule la rastérisation conservatrice surestimée est disponible en mode rastérisation.

Si une partie d’une primitive chevauche un pixel, ce pixel est considéré comme couvert et est ensuite rastérisé. Lorsqu’un bord ou un coin d’une primitive tombe le long du bord ou du coin 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 coin doit couvrir au moins un pixel.

Les implémentations de rastérisation conservatrices peuvent varier selon le matériel 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 les erreurs de croissance primitive ou d’alignement inhérentes aux coordonnées de vertex à point fixe utilisées dans la rastérisation. La raison pour laquelle les faux positifs (en ce qui concerne les coordonnées de vertex à point fixe) sont valides parce qu’une certaine quantité de faux positifs est nécessaire pour permettre à une implémentation d’effectuer une évaluation de couverture par rapport aux sommets post-alignement (c’est-à-dire les coordonnées de vertex qui ont été converties de la virgule flottante au point fixe 16,8 utilisé dans le rastériseur), mais respectent 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 rastérisé.

Les triangles qui sont dégénérés (indices dupliqués dans une mémoire tampon d’index ou collineaires en 3D), ou qui deviennent dégénérés après une conversion à point fixe (sommets collineaires dans le rastériseur), peuvent ou non être éliminés; les deux sont des comportements valides. Les triangles dégénérés doivent être considérés comme orientés vers l’arrière. Par conséquent, si un comportement spécifique est requis par une application, elle peut utiliser l’élimination de face arrière ou le test pour la face avant. Les triangles dégénérés utilisent les valeurs affectées au vertex 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 zone d’incertitude maximale de 1/2 pixels et ne prend pas en charge les dégénérations post-alignement. C’est bon pour le rendu en mosaïque, un atlas de textures, la génération de cartes de lumière et les cartes d’ombres en sous-pixels.
  • Le niveau 2 réduit la zone d’incertitude maximale à 1/256 et exige que les dégénérés post-alignement ne soient pas éliminés. Ce niveau est utile pour l’accélération de l’algorithme basée sur le processeur (comme la voxelisation).
  • Le niveau 3 maintient une zone d’incertitude maximale de 1/256 et ajoute la prise en charge de la couverture d’entrée interne. 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 d’un nuanceur de pixels et qui représente les informations de rastérisation conservatrice sous-estimées (autrement dit, si un pixel est entièrement couvert). Ce niveau est utile pour l’élimination de l’occlusion.

Résumé des API

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

Tutoriels vidéo sur l’apprentissage avancé DirectX : Rastérisation conservatrice

Affichage ordonné du rastériseur

Rendu