Découper des plans utilisateur sur du matériel de niveau de fonctionnalité 9

À compter de Windows 8, Le langage HLSL (High Level Shader Language) Microsoft prend en charge une syntaxe que vous pouvez utiliser avec l’API Microsoft Direct3D 11 pour spécifier des plans de découpage utilisateur au niveau des fonctionnalités 9_x et versions ultérieures. Vous pouvez utiliser cette syntaxe clip-planes pour écrire un nuanceur, puis utiliser cet objet de nuanceur avec l’API Direct3D 11 pour s’exécuter sur tous les niveaux de fonctionnalité Direct3D.

Arrière-plan

Vous pouvez accéder aux plans de découpage utilisateur dans l’API Microsoft Direct3D 9 via les méthodes IDirect3DDevice9::SetClipPlane et IDirect3DDevice9::GetClipPlane . Dans Microsoft Direct3D 10 et versions ultérieures, vous pouvez accéder aux plans de découpage utilisateur via la sémantique SV_ClipDistance . Mais avant Windows 8, SV_ClipDistance n’était pas disponible pour le matériel de niveau de fonctionnalité 9_x dans les API Direct3D 10 ou Direct3D 11. Ainsi, avant Windows 8, la seule façon d’accéder aux plans de découpage utilisateur avec un niveau de fonctionnalité 9_x matériel était de passer par l’API Direct3D 9. Les applications Du Windows Store Direct3D ne peuvent pas utiliser l’API Direct3D 9. Ici, nous décrivons la syntaxe que vous pouvez utiliser pour accéder aux plans de découpage utilisateur via l’API Direct3D 11 au niveau des fonctionnalités 9_x et versions ultérieures.

Les applications utilisent des plans de découpage pour définir un ensemble de plans invisibles dans le monde 3D qui découpent (jetent) toutes les primitives dessinées. Windows ne dessine aucun pixel qui se trouve sur le côté négatif des plans de découpage. Les applications peuvent ensuite utiliser des plans de découpage pour afficher des réflexions planaires.

Syntaxe

Utilisez cette syntaxe pour déclarer des plans de découpage en tant qu’attributs de fonction dans une déclaration de fonction. Par exemple, ici, nous utilisons la syntaxe sur un fragment de nuanceur de vertex :

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

Cet exemple pour un fragment de nuanceur de vertex indique deux plans de découpage. Il indique que vous devez placer le nouvel attribut clipplanes entre crochets immédiatement avant la valeur de retour du nuanceur de vertex. Entre parenthèses après l’attribut clipplanes , vous fournissez une liste de jusqu’à 6 constantes float4 qui définissent les coefficients de plan pour chaque plan de découpage actif. L’exemple montre également que vous devez faire en sorte que les coefficients de chaque plan résident dans une mémoire tampon constante.

Notes

Aucune syntaxe n’est disponible pour désactiver dynamiquement un plan clip. Vous devez recompiler un nuanceur identique sans attribut clipplanes , ou votre application peut définir les coefficients de votre mémoire tampon constante sur zéro afin que le plan n’affecte plus la géométrie.

 

Cette syntaxe est disponible pour toute cible de nuanceur de vertex 4.0 ou ultérieure, qui inclut vs_4_0_level_9_1 et vs_4_0_level_9_3.

Création de plans de clip dans l’espace de clip au niveau de fonctionnalité 9 et supérieur

Ici, nous montrons comment créer des plans de découpage dans l’espace de clip au niveau de la fonctionnalité 9_x et supérieur.

Lecture en arrière-plan

« Introduction to 3D Game Programming with DirectX 10 » de Frank D. Luna explique l’arrière-plan mathématique graphique (chapitres 1, 2 et 3) dont vous avez besoin, ainsi que les différentes transformations d’espaces et d’espace qui se produisent dans le nuanceur de vertex (sections 5.6 et 5.8).

Niveaux de fonctionnalité 10Level9

Dans Direct3D 10 et versions ultérieures, vous pouvez effectuer un découpage dans n’importe quel espace logique, souvent dans l’espace du monde ou l’espace d’affichage. Mais Direct3D 9 utilise l’espace clip, qui est l’espace de projection avant la division de perspective. Les vecteurs sont dans l’espace clip lorsque le nuanceur de vertex les transmet aux étapes qui suivent dans le pipeline graphique.

Lorsque vous écrivez une application du Windows Store, vous devez utiliser les niveaux de fonctionnalité 10Level9 (niveau de fonctionnalité 9_x) afin que l’application puisse s’exécuter au niveau des fonctionnalités 9_x et du matériel supérieur. Étant donné que votre application prend en charge le niveau de fonctionnalité 9_x et supérieur, vous devez également utiliser la fonctionnalité courante d’application de plans de découpage dans l’espace clip.

Lorsque vous compilez un nuanceur de vertex avec vs_4_0_level_9_1 ou une version ultérieure, ce nuanceur de vertex peut utiliser l’attribut clipplanes . Un objet Direct3D 10 ou ultérieur a un produit de point du vertex émis qui contient chacune des constantes globales float4 spécifiées dans l’attribut . L’objet Direct3D 9 contient suffisamment de métadonnées pour que le runtime 10Level9 émette les appels appropriés à IDirect3DDevice9::SetClipPlane.

Calcul du plan de découpage

Un plan de découpage est défini par un vecteur avec 4 composants. Les trois premiers composants définissent un vecteur x, y, z qui émane de l’origine dans l’espace que nous voulons découper. Ce vecteur implique un plan, perpendiculaire au vecteur et parcourant l’origine. Windows conserve tous les pixels sur le côté vecteur du plan et clipse tous les pixels derrière le plan. Le composant w de revenir en arrière le plan et entraîne l’agrafe moins de Windows (un w négatif provoque l’agrafe plus) le long de la ligne vectorielle. Si les composants x, y, z composent un vecteur d’unité (normalisé), w renvoie le plan w units.

Le calcul effectué par l’unité de traitement graphique (GPU) pour déterminer le découpage est un produit à points simple entre le vecteur de vertex (x, y, z, 1) et le vecteur du plan de découpage. Cette opération mathématique crée une longueur de projection sur le vecteur du plan d’clip. Un produit à points négatifs montre le sommet à se trouver sur le côté coupé du plan.

Découpage dans l’espace d’affichage

Voici notre vertex dans l’espace d’affichage :

vertex dans l’espace d’affichage

Voici notre plan clip dans l’espace d’affichage :

Plan de découpage dans l’espace d’affichage

Voici le produit à points du sommet et du plan de découpage dans l’espace d’affichage :

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

Cette opération mathématique fonctionne pour un objet Direct3D 10 ou ultérieur, mais ne fonctionne pas pour un objet Direct3D 9. Pour Direct3D 9, nous devons d’abord passer à travers notre transformation de projection en espace clip.

Matrice de projection

Une matrice de projection transforme un vertex de l’espace d’affichage (où l’origine est l’œil du spectateur, +x est à droite, +y est haut et +z est tout droit devant) en espace clip. La matrice de projection lit le vertex pour le découpage matériel et l’étape de rastérisation. Voici une matrice de perspective standard (d’autres projections nécessitent des calculs différents) :

*r* ratio largeur/hauteur de la fenêtre *α* angle de vue *f* distance entre la visionneuse et le plan lointain *n* distance de la visionneuse au plan proche
! [matrice de projection] (images/projection-matrix.png)

La matrice suivante est une version simplifiée de la matrice précédente. Nous montrons la matrice simplifiée afin de pouvoir l’utiliser plus tard dans l’opération de multiplication de matrice.

matrice de projection simplifiée

À présent, nous transformons notre vertex d’espace d’affichage en espace clip avec une matrice multipliée :

matrice multiplier

Dans notre opération de multiplication matricielle, nos composants x et y ne sont que légèrement ajustés, mais nos composants z et w sont assez mal modifiés. Notre plan de clip ne nous donnera plus ce que nous voulons.

Plan de découpage de l’espace

Ici, nous voulons créer un plan de clip d’espace clip dont le produit point avec notre vertex d’espace d’clip nous donne la même valeur que v · C dans la section Découpage dans l’espace d’affichage .

plan de découpage

v · C = v P · CP

vCₓ +v yCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCP

À présent, nous pouvons diviser l’opération mathématique précédente par composant de vertex en quatre équations distinctes :

x composant vertex du produit de plan de découpage

Composant vertex y du produit de plan de découpage

composant vertex w du produit de plan de découpage

Composant z vertex du produit de plan de découpage

Notre plan de découpage d’espace d’affichage et notre matrice de projection dérivent et nous donnent notre plan de clip d’espace de clip.

plan d’clip d’espace clip

Guide de programmation pour HLSL

Syntaxe de la déclaration des fonctions