Étapes de pavage
Le runtime Direct3D 11 prend en charge trois nouvelles phases qui implémentent la pavage, qui convertit les surfaces de sous-division de bas détail en primitives plus détaillées sur le GPU. Les mosaïques de pavage (ou décomposent) des surfaces de haut ordre dans des structures appropriées pour le rendu.
En implémentant le pavage dans le matériel, un pipeline graphique peut évaluer des modèles de détail inférieurs (nombre de polygones inférieurs) et afficher en détail. Bien que la pavage logicielle puisse être effectuée, la pavage implémentée par le matériel peut générer une quantité incroyable de détails visuels (y compris la prise en charge du mappage de déplacement) sans ajouter les détails visuels aux tailles du modèle et paralyser les taux d’actualisation.
- avantages de pavage
- nouvelles étapes de pipeline
- API pour initialiser les étapes de pavage
- Procédure :
- rubriques connexes
Avantages de la pavage
Pavage :
- Enregistre un grand nombre de mémoire et de bande passante, ce qui permet à une application d’afficher des surfaces plus détaillées à partir de modèles à faible résolution. La technique de pavage implémentée dans le pipeline Direct3D 11 prend également en charge le mappage de déplacement, ce qui peut produire de superbes quantités de détails de surface.
- Prend en charge les techniques de rendu évolutives, telles que les niveaux de détail dépendants continus ou d’affichage, qui peuvent être calculés à la volée.
- Améliore les performances en effectuant des calculs coûteux à une fréquence inférieure (en effectuant des calculs sur un modèle de détail inférieur). Cela peut inclure des calculs de fusion à l’aide de formes de fusion ou de cibles morphes pour des calculs d’animation ou de physique réalistes pour la détection de collision ou la dynamique du corps doux.
Le pipeline Direct3D 11 implémente la pavage dans le matériel, qui décharge le travail de l’UC vers le GPU. Cela peut entraîner des améliorations très importantes des performances si une application implémente un grand nombre de cibles de morphes et/ou des modèles de déformation/peau plus sophistiqués. Pour accéder aux nouvelles fonctionnalités de pavage, vous devez en savoir plus sur les nouvelles étapes de pipeline.
Nouvelles étapes de pipeline
La pavage utilise le GPU pour calculer une surface plus détaillée à partir d’une surface construite à partir de quad patches, de correctifs triangles ou d’isolines. Pour estimer la surface à ordre élevé, chaque patch est subdivisé en triangles, points ou lignes à l’aide de facteurs de pavage. Le pipeline Direct3D 11 implémente la pavage à l’aide de trois nouvelles étapes de pipeline :
- Hull-Shader Stage : étape de nuanceur programmable qui produit un patch geometry (et des constantes correctives) qui correspondent à chaque correctif d’entrée (quad, triangle ou ligne).
- Étape Tessellator : étape de pipeline de fonction fixe qui crée un modèle d’échantillonnage du domaine qui représente le correctif geometry et génère un ensemble d’objets plus petits (triangles, points ou lignes) qui connectent ces exemples.
- Domain-Shader Étape : étape de nuanceur programmable qui calcule la position de vertex correspondant à chaque exemple de domaine.
Le diagramme suivant met en évidence les nouvelles phases du pipeline Direct3D 11.
Le diagramme suivant montre la progression à travers les étapes de pavage. La progression commence par la surface de sous-division basse. La progression met ensuite en évidence le correctif d’entrée avec le correctif geometry, les exemples de domaine et les triangles correspondants qui connectent ces exemples. La progression met enfin en évidence les sommets qui correspondent à ces exemples.
diagramme
étape de Hull-Shader
Un nuanceur de coque - appelé une fois par patch - transforme les points de contrôle d’entrée qui définissent une surface de faible ordre en points de contrôle qui composent un patch. Il effectue également certains calculs par correctif pour fournir des données pour l’étape de pavage et l’étape de domaine. Au niveau de la boîte noire la plus simple, l’étape du nuanceur de coque ressemblerait au diagramme suivant.
diagramme
Un nuanceur de coque est implémenté avec une fonction HLSL et possède les propriétés suivantes :
- L’entrée du nuanceur est comprise entre 1 et 32 points de contrôle.
- La sortie du nuanceur est comprise entre 1 et 32 points de contrôle, quel que soit le nombre de facteurs de pavage. La sortie des points de contrôle d’un nuanceur de coque peut être consommée par l’étape du nuanceur de domaine. Les données constantes correctives peuvent être consommées par un nuanceur de domaine ; Les facteurs de pavage peuvent être consommés par le nuanceur de domaine et l’étape de pavage.
- Les facteurs de pavage déterminent la quantité à subdiviser chaque correctif.
- Le nuanceur déclare l’état requis par l’étape tessellator. Cela inclut des informations telles que le nombre de points de contrôle, le type de visage du correctif et le type de partitionnement à utiliser lors de la tessellating. Ces informations apparaissent généralement sous forme de déclarations devant le code du nuanceur.
- Si l’étape du nuanceur de coque définit un facteur de pavage d’arête sur = 0 ou NaN, le correctif est supprimé. Par conséquent, l’étape tessellator peut ou non s’exécuter, le nuanceur de domaine ne s’exécutera pas et aucune sortie visible ne sera produite pour ce correctif.
À un niveau plus profond, un nuanceur de coque fonctionne en deux phases : une phase de point de contrôle et une phase de constante corrective, qui sont exécutées en parallèle par le matériel. Le compilateur HLSL extrait le parallélisme dans un nuanceur de coque et l’encode en bytecode qui pilote le matériel.
- La phase de point de contrôle fonctionne une fois pour chaque point de contrôle, en lisant les points de contrôle d’un correctif et en générant un point de contrôle de sortie (identifié par un ControlPointID).
- La phase de constante de correctif fonctionne une fois par correctif pour générer des facteurs de pavage de périphérie et d’autres constantes par patch. En interne, de nombreuses phases de constantes correctives peuvent s’exécuter en même temps. La phase de constante corrective a un accès en lecture seule à tous les points de contrôle d’entrée et de sortie.
Voici un exemple de nuanceur de coque :
[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
InputPatch<MyInPoint, 12> InPts)
{
MyOutPoint result;
...
result = TransformControlPoint( InPts[Id] );
return result;
}
Pour obtenir un exemple qui crée un nuanceur de coque, consultez How To : Create a Hull Shader.
Étape Tessellator
Le tessellator est une phase de fonction fixe initialisée en liant un nuanceur de coque au pipeline (voir How To : Initialize the Tessellator Stage). L’objectif de l’étape tessellator est de subdiviser un domaine (quad, tri ou ligne) en de nombreux objets plus petits (triangles, points ou lignes). Les tessellators vignettent un domaine canonique dans un système de coordonnées normalisé (zéro à un). Par exemple, un domaine quad est tessellé à un carré d’unité.
Le tessellator fonctionne une fois par patch à l’aide des facteurs de pavage (qui spécifient la précision du domaine à tessellation) et le type de partitionnement (qui spécifie l’algorithme utilisé pour découper un patch) transmis à partir de l’étape du nuanceur de coque. Le tessellator génère des coordonnées uv (et éventuellement w) et la topologie de surface à l’étape du nuanceur de domaine.
En interne, le tessellator opère en deux phases :
- La première phase traite les facteurs de pavage, la résolution des problèmes d’arrondi, la gestion de très petits facteurs, la réduction et la combinaison de facteurs, à l’aide d’arithmétique à virgule flottante 32 bits.
- La deuxième phase génère des listes de points ou de topologie en fonction du type de partitionnement sélectionné. Il s’agit de la tâche principale de l’étape tessellator et utilise des fractions 16 bits avec arithmétique à point fixe. L’arithmétique à point fixe permet l’accélération matérielle tout en conservant une précision acceptable. Par exemple, étant donné un patch de 64 mètres de largeur, cette précision peut placer des points à une résolution de 2 mm.
Type de partitionnement | Gamme |
---|---|
fractional_odd | [1...63] |
fractional_even | Plage TessFactor : [2..64] |
entier | Plage TessFactor : [1..64] |
pow2 | Plage TessFactor : [1..64] |
étape de Domain-Shader
Un nuanceur de domaine calcule la position de vertex d’un point subdividé dans le correctif de sortie. Un nuanceur de domaine est exécuté une fois par point de sortie de l’étape tessellator et dispose d’un accès en lecture seule aux coordonnées UV de sortie de l’étape tessellator, au patch de sortie du nuanceur de coque et aux constantes des correctifs de sortie du nuanceur de coque, comme le montre le diagramme suivant.
diagramme
Les propriétés du nuanceur de domaine sont les suivantes :
- Un nuanceur de domaine est appelé une fois par coordonnée de sortie de l’étape tessellator.
- Un nuanceur de domaine consomme des points de contrôle de sortie à partir de l’étape du nuanceur de coque.
- Un nuanceur de domaine génère la position d’un sommet.
- Les entrées sont les sorties du nuanceur de coque, notamment les points de contrôle, les données constantes correctives et les facteurs de pavage. Les facteurs de pavage peuvent inclure les valeurs utilisées par la fonction fixe tessellator ainsi que les valeurs brutes (avant l’arrondi par la pavage d’entiers, par exemple), ce qui facilite la géomorphose, par exemple.
Une fois le nuanceur de domaine terminé, la pavage est terminée et les données de pipeline passent à l’étape suivante du pipeline (nuanceur de géométrie, nuanceur de pixels, etc.). Un nuanceur géométrique qui s’attend à des primitives avec addjacency (par exemple, 6 sommets par triangle) n’est pas valide lorsque le pavage est actif (cela entraîne un comportement non défini, dont la couche de débogage se plaindra).
Voici un exemple de nuanceur de domaine :
void main( out MyDSOutput result,
float2 myInputUV : SV_DomainPoint,
MyDSInput DSInputs,
OutputPatch<MyOutPoint, 12> ControlPts,
MyTessFactors tessFactors)
{
...
result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}
API pour initialiser les étapes de pavage
La pavage est implémentée avec deux nouvelles étapes de nuanceur programmable : un nuanceur de coque et un nuanceur de domaine. Ces nouvelles phases de nuanceur sont programmées avec du code HLSL défini dans le modèle de nuanceur 5. Les nouvelles cibles de nuanceur sont les suivantes : hs_5_0 et ds_5_0. Comme toutes les phases de nuanceur programmables, le code du matériel est extrait des nuanceurs compilés transmis au runtime lorsque les nuanceurs sont liés au pipeline à l’aide d’API telles que DSSetShader et HSSetShader. Mais tout d’abord, le nuanceur doit être créé à l’aide d’API telles que CreateHullShader et CreateDomainShader.
Activez la pavage en créant un nuanceur de coque et en le liant à l’étape du nuanceur de coque (cela configure automatiquement l’étape de tessellator). Pour générer les positions de vertex finales à partir des correctifs tessellated, vous devez également créer un nuanceur de domaine et le lier à l’étape du nuanceur de domaine. Une fois la pavage activée, l’entrée de données à l’étape d’assembleur d’entrée doit être des données correctives. Autrement dit, la topologie de l’assembleur d’entrée doit être une topologie de constante de correctif à partir de D3D11_PRIMITIVE_TOPOLOGY définie avec IASetPrimitiveTopology.
Pour désactiver le pavage, définissez le nuanceur de coque et le nuanceur de domaine sur NULL. Ni l’étape du nuanceur geometry ni l’étape de sortie de flux ne peuvent lire les points de contrôle de sortie du nuanceur de coque ou les données correctives.
Nouvelles topologies pour la phase d’assembleur d’entrée, qui sont des extensions à cette énumération.
enum D3D11_PRIMITIVE_TOPOLOGY
La topologie est définie sur l’étape d’assembleur d’entrée à l’aide de IASetPrimitiveTopology
Bien sûr, les nouvelles phases de nuanceur programmable nécessitent que d’autres états soient définis, pour lier des mémoires tampons constantes, des exemples et des ressources de nuanceur aux étapes de pipeline appropriées. Ces nouvelles méthodes ID3D11Device sont implémentées pour définir cet état.
- DSGetConstantBuffers
- DSGetSamplers
- DSGetShader
- DSGetShaderResources
- DSSetConstantBuffers
- DSSetSamplers
- DSSetShader
- DSSetShaderResources
- HSGetConstantBuffers
- HSGetShaderResources
- HSGetSamplers
- HSGetShader
- HSSetConstantBuffers
- HSSetSamplers
- HSSetShader
- HSSetShaderResources
Procédure :
La documentation contient également des exemples d’initialisation des étapes de pavage.
Article | Description |
---|---|
Comment : créer un nuanceur de coque |
Créez un nuanceur de coque. |
Comment : concevoir un nuanceur de coque |
Concevez un nuanceur de coque. |
Comment : initialiser l’étape Tessellator |
Initialisez l’étape de pavage. |
Comment : créer un nuanceur de domaine |
Créez un nuanceur de domaine. |
Comment : concevoir un nuanceur de domaine |
Créez un nuanceur de domaine. |