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

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

Contexte

Vous pouvez accéder aux plans de clips 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 d’utilisateur à l’aide de 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. donc, avant Windows 8, le seul moyen d’accéder aux plans de l’utilisateur avec le matériel de niveau de fonctionnalité 9 _ x consistait à utiliser l’API Direct3D 9. les applications direct3d Windows store ne peuvent pas utiliser l’API direct3d 9. Ici, nous décrivons la syntaxe que vous pouvez utiliser pour accéder aux plans de l’utilisateur via l’API Direct3D 11 au niveau de la fonctionnalité 9 _ x et versions ultérieures.

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

Syntax

Utilisez cette syntaxe pour déclarer des plans d’éléments 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 sommets :

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 sommets désigne deux plans de clip. Il montre que vous devez placer le nouvel attribut clipplanes entre crochets immédiatement avant la valeur de retour du nuanceur de sommets. Entre parenthèses après l’attribut clipplanes , vous fournissez une liste de 6 constantes float4 au maximum 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 de découpage. Vous devez recompiler un nuanceur identique qui ne possède pas d’attribut clipplanes , ou votre application peut définir les coefficients dans votre mémoire tampon constante à 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 sommets 4,0 ou ultérieur, qui comprend vs _ 4 _ 0 _ niveau _ 9 _ 1 et vs _ 4 _ 0 _ niveau _ 9 _ 3.

Création de plans de clip dans l’espace sur le niveau de fonctionnalité 9 et versions ultérieures

Ici, nous montrons comment créer des plans de clips dans l’espace sur les fonctionnalités 9 _ x et supérieures.

Lecture en arrière-plan

« Introduction à la programmation de jeux en 3D avec DirectX 10 » de Frank D. Luna explique l’arrière-plan mathématique des graphiques (chapitres 1, 2 et 3) dont vous avez besoin, ainsi que les différentes transformations d’espaces et d’espaces qui se produisent dans le nuanceur de sommets (sections 5,6 et 5,8).

niveaux de fonctionnalité de 10Level9

Dans Direct3D 10 et versions ultérieures, vous pouvez découper n’importe quel espace logique, souvent dans l’espace universel ou dans l’espace d’affichage. Mais Direct3D 9 utilise l’espace de clip, qui est un espace de projection de préversion préalable. Les vecteurs sont dans l’espace de l’élément lorsque le nuanceur de sommets les passe aux étapes qui suivent dans le pipeline Graphics.

lorsque vous écrivez une application Windows Store, vous devez utiliser les niveaux de fonctionnalité 10Level9 (niveau de fonctionnalité 9 _ x) pour que l’application puisse s’exécuter sur du matériel de niveau de fonctionnalité 9 _ x et supérieur. Étant donné que votre application prend en charge le niveau de fonctionnalité 9 _ x et les versions ultérieures, vous devez également utiliser la fonction d’application commune des plans de clip dans l’espace.

Quand vous compilez un nuanceur vertex avec vs _ 4 _ 0 _ niveau _ 9 _ 1 ou version ultérieure, ce nuanceur vertex peut utiliser l’attribut clipplanes . Un objet Direct3D 10 ou version ultérieure possède un produit scalaire du vertex émis qui contient chacune des constantes globales float4 spécifiées dans l’attribut. L’objet Direct3D 9 a suffisamment de métadonnées pour obliger le runtime 10Level9 à émettre les appels appropriés à IDirect3DDevice9 :: SetClipPlane.

Math plan de coupe

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 de l’espace que vous souhaitez découper. Ce vecteur implique un plan, perpendiculaire au vecteur et s’exécutant par le biais de l’origine. Windows conserve tous les pixels sur le côté vecteur du plan et découpe tous les pixels situés derrière le plan. le composant w est repousse le plan et provoque Windows pour découper moins (une w négative entraîne Windows à découper plus) le long de la ligne vectorielle. Si les composants x, y, z composent un vecteur unitaire (normalisé), w pousse les unités du plan w vers l’arrière.

La mathématique que l’unité de traitement graphique (GPU) effectue pour déterminer le découpage est un simple point 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 de plan de découpage. Un point négatif indique que le vertex se trouve 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 de découpage dans l’espace d’affichage :

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

Voici le produit scalaire du vertex et du plan de découpage dans l’espace d’affichage :

ClipDistance = v · C = vc ₓ +vyco + vzcz + c

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

Matrice de projection

Une matrice de projection transforme un sommet de l’espace d’affichage (où l’origine est l’œil de la visionneuse, + x est à droite, + y est haut et + z est en avance) dans l’espace. La matrice de projection lit le vertex pour la capture de matériel et l' étape de pixellisation. Voici une matrice de perspective standard (les autres projections requièrent des maths différentes) :

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

La matrice suivante est une version simplifiée de la matrice précédente. Nous affichons la matrice de manière simplifiée afin de pouvoir l’utiliser ultérieurement dans l’opération de multiplication de matrice.

matrice de projection simplifiée

Nous transformons maintenant notre sommet d’espace d’affichage en espace de clip avec une matrice multiplier :

multiplication de matrice

Dans notre opération de multiplication de matrice, nos composants x et y sont légèrement ajustés, mais nos composants z et w sont très déformés. Notre plan de découpage 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 disque dont le produit scalaire avec le sommet de l’espace disque 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 ₓ +vyco + vzcz + cw = vPcp ₓ + vypycp y + vzAycp z + BCP z + vzcp

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

composant de vertex x du produit de plan de découpage

composant du vertex y du produit de plan de découpage

composant de vertex w du produit de plan de découpage

composant de sommet z du produit de plan de découpage

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

plan de découpage de l’espace

Guide de programmation pour HLSL

Syntaxe de la déclaration des fonctions