Partager via


Plans de clip utilisateur sur le matériel de niveau 9 de fonctionnalité

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

Arrière-plan

Vous pouvez accéder aux plans de clip utilisateur dans l’API Microsoft Direct3D 9 via IDirect3DDevice9 ::SetClipPlane et méthodes IDirect3DDevice9 ::GetClipPlane. Dans Microsoft Direct3D 10 et versions ultérieures, vous pouvez accéder aux plans de clip utilisateur via la sémantique SV_ClipDistance. Mais avant Windows 8, SV_ClipDistance n’était pas disponible pour niveau de fonctionnalité 9_x matériel dans les API Direct3D 10 ou Direct3D 11. Par conséquent, avant Windows 8, le seul moyen d’accéder aux plans de presse utilisateur avec le niveau de fonctionnalité 9_x matériel était via 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 clip utilisateur via l’API Direct3D 11 au niveau des fonctionnalités 9_x et versions ultérieures.

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

Syntaxe

Utilisez cette syntaxe pour déclarer des plans clip en tant qu’attributs de fonction dans une déclaration de fonction . Par exemple, nous utilisons ici 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 désigne deux plans clip. Il indique que vous devez placer le nouveau clipplan attribut entre crochets juste avant la valeur de retour du nuanceur de vertex. Entre parenthèses après l’attribut clipplanes, vous fournissez une liste allant jusqu’à 6 constantes float4 qui définissent les coefficients de plan pour chaque plan clip actif. L’exemple montre également que vous devez rendre les coefficients de chaque plan dans une mémoire tampon constante.

Note

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

 

Cette syntaxe est disponible pour n’importe quelle 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 clip dans l’espace clip sur le niveau de fonctionnalité 9 et versions ultérieures

Ici, nous montrons comment créer des plans clip dans l’espace clip sur niveau de fonctionnalité 9_x et versions ultérieures.

Lecture en arrière-plan

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

10Level9 niveaux de fonctionnalités

Dans Direct3D 10 et versions ultérieures, vous pouvez découper dans n’importe quel espace qui est logique, souvent dans l’espace mondial ou l’espace d’affichage. Mais Direct3D 9 utilise l’espace clip, qui est l’espace de projection prédéfini par perspective. Les vecteurs sont dans l’espace clip lorsque le nuanceur de vertex les transmet à des étapes qui suivent dans le pipeline graphique .

Lorsque vous écrivez une application du Windows Store, vous devez utiliser des niveaux de fonctionnalités 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 versions ultérieures, vous devez également utiliser la fonctionnalité courante d’application de plans clip dans l’espace clip.

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

Calcul du plan de découpage

Un plan clip 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 qui traverse l’origine. Windows conserve tous les pixels du côté vecteur du plan et extrait tous les pixels derrière le plan. Le composant vers le haut du plan renvoie le plan et provoque le découpage de Windows moins (un w négatif provoque le découpage de Windows 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.

Les mathématiques effectuées par l’unité de traitement graphique (GPU) pour déterminer la capture sont 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 clip. Un produit point négatif montre le sommet à découper du côté du plan.

Découpage dans l’espace d’affichage

Voici notre sommet dans l’espace d’affichage :

vertex dans l’espace d’affichage

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

plan clip dans l’espace d’affichage

Voici le produit point de vertex et de plan clip dans l’espace d’affichage :

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

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

Matrice de projection

Une matrice de projection transforme un sommet à partir de l’espace d’affichage (où l’origine est l’œil de la visionneuse, +x est à droite, +y est vers le haut, et +z est directement 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 mathématiques différentes) :

*r* rapport de largeur/hauteur de fenêtre *α* angle d’affichage *f* distance de la visionneuse au 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 ultérieurement dans l’opération de multiplication de matrice.

matrice de projection simplifiée

Maintenant, nous transformons notre sommet d’espace d’affichage en espace clip avec une matrice multipliée :

matrice multiplier

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

Clip space clip plane

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

plan clip

v · C = v P · CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCPw

Nous pouvons maintenant décomposer l’opération mathématique précédente par composant de vertex en quatre équations distinctes :

composant de vertex x du produit clip plane

composant de vertex y du produit clip plane

composant w vertex du produit clip plane

composant de vertex z du produit clip plane

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

du plan de presse-papiers d’espace clip

Guide de programmation pour hlSL

syntaxe de déclaration de fonction