Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les nuanceurs de vertex et les nuanceurs de pixels sont simplifiés considérablement à partir des versions antérieures du nuanceur. Si vous implémentez des nuanceurs dans le matériel, vous n’utilisez peut-être pas vs_3_0 ou ps_3_0 avec d’autres versions de nuanceur, et vous n’utilisez peut-être pas le type de nuanceur avec le pipeline de fonction fixe. Ces modifications permettent de simplifier les pilotes et le runtime. La seule exception est que les nuanceurs de vs_3_0 logiciels uniquement peuvent être utilisés avec n’importe quelle version de nuanceur de pixels. En outre, si vous utilisez un nuanceur de vs_3_0 logiciel uniquement avec une version précédente du nuanceur de pixels, le nuanceur de vertex ne peut utiliser que la sémantique de sortie compatible avec les codes de format de vertex flexibles (FVF).
La sémantique utilisée sur les sorties du nuanceur de vertex doit être utilisée sur les entrées du nuanceur de pixels. La sémantique est utilisée pour mapper les sorties du nuanceur de vertex aux entrées du nuanceur de pixels, comme la façon dont la déclaration de vertex est mappée aux registres d’entrée du nuanceur de vertex et aux modèles de nuanceur précédents. Consultez la sémantique de correspondance sur les nuanceurs 3.0 et ps 3.0.
Des états de rendu supplémentaires en mode wrap ont été ajoutés pour couvrir la possibilité de coordonnées de texture supplémentaires dans ce nouveau schéma. Les attributs avec D3DDECLUSAGE_TEXCOORD et l’index d’utilisation de 0 à 15 sont interpolés en mode wrap lorsque leD3DRS_WRAP* correspondant est défini.
- fonctionnalités du nuanceur de vertex Model 3
- Fonctionnalités du nuanceur de pixels modèle 3
- Sémantique de correspondance sur vs_3_0 et les nuanceurs de ps_3_0
- le brouillard, la profondeur et le mode ombrage changent
- conversions de virgule flottante et d’entier
- spécification de de précision complète ou partielle
- Les nuanceurs de vertex et de pixels logiciels
Fonctionnalités du nuanceur de vertex Model 3
Les types de registre de sortie du nuanceur de vertex ont été réduits en douze registres (voir Registres de sortie). Chaque registre utilisé doit être déclaré à l’aide de l’instruction dcl et d’une sémantique (par exemple, dcl_color0 o0.xyzw).
Le modèle de nuanceur de vertex 3_0 (vs_3_0) s’étend sur les fonctionnalités de vs_2_0 avec l’indexation de registre plus puissante, un ensemble de registres de sortie simplifiés, la possibilité d’échantillonner une texture dans un nuanceur de vertex et la possibilité de contrôler la vitesse à laquelle les entrées du nuanceur sont initialisées.
Indexer n’importe quel registre
Tous les registres ( registre d’entrée et registres de sortie) peuvent être indexés à l’aide de registre de compteurs de boucles (seuls les registres de constantes peuvent être indexés dans les versions antérieures.)
Vous devez déclarer des registres d’entrée et de sortie avant de les indexer. Toutefois, vous ne pouvez indexer aucun registre de sortie déclaré avec une sémantique de taille de position ou de point. En fait, si l’indexation est utilisée, la sémantique de position et de psize doit être déclarée dans les registres o0 et o1 respectivement.
Vous n’êtes autorisé à indexer qu’une plage continue de registres ; autrement dit, vous ne pouvez pas indexer les registres qui n’ont pas été déclarés. Bien que cette restriction soit peu pratique, elle permet l’optimisation matérielle. Toute tentative d’indexation sur des registres non contigus génère des résultats non définis. La validation du nuanceur n’applique pas cette restriction.
Simplifier les registres de sortie
Tous les différents types de registres de sortie ont été réduits en douze registres de sortie : 1 pour la position, 2 pour la couleur, 8 pour la texture et 1 pour la taille de brouillard ou de point. Ces registres interpolent toutes les données qu’ils contiennent pour le nuanceur de pixels. Les déclarations de registre de sortie sont requises et la sémantique est affectée à chaque registre.
Les registres peuvent être divisés comme suit :
- Au moins un registre doit être déclaré en tant que registre de position à quatre composants. Il s’agit du seul registre de nuanceur de vertex requis.
- Les dix premiers registres consommés par un nuanceur peuvent utiliser jusqu’à quatre composants (xyzw) maximum.
- Le dernier (ou douzième) registre ne peut contenir qu’un scalaire (par exemple, une taille de point).
Pour obtenir la liste des registres, consultez Registres - vs_3_0.
Exemple de texture dans un nuanceur de vertex
Le nuanceur de vertex 3_0 prend en charge la recherche de texture dans le nuanceur de vertex à l’aide de texldl - vs.
Fonctionnalités du nuanceur de pixels Model 3
La couleur du nuanceur de pixels et les registres de texture ont été réduits en dix registres d’entrée (voir types de registre d’entrée). Le registre visage est un registre scalaire à virgule flottante. Seul le signe de ce registre est valide. Si le signe est négatif, la primitive est un visage arrière. Cela peut être utilisé à l’intérieur d’un nuanceur de pixels pour obtenir un éclairage à deux côtés, par exemple. Le registre de positions fait référence aux pixels actuels (x,y).
Les registres de constantes du nuanceur peuvent être définis à l’aide de :
Faire correspondre la sémantique sur les nuanceurs de vs_3_0 et de ps_3_0
Il existe certaines restrictions sur l’utilisation sémantique avec vs_3_0 et ps_3_0. En général, vous devez être prudent lors de l’utilisation d’une sémantique pour une entrée de nuanceur qui correspond à une sémantique utilisée sur une sortie de nuanceur.
Par exemple, ce nuanceur de pixels regroupe plusieurs noms dans un registre :
ps_3_0
dcl_texcoord0 v0.x
dcl_texcoord1 v0.yz // Valid to pack multiple names into one register
dcl_texcoord2_centroid v1.w
...
Chaque registre a une sémantique différente. Notez que vous pouvez également nommer v0.x et v0.yz avec une sémantique différente (multiple) en raison de l’utilisation du masque d’écriture.
Étant donné le nuanceur de pixels, le nuanceur de vs_3_0 suivant ne peut pas être associé à celui-ci :
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o6.yzw
...
Ces deux nuanceurs entrent en conflit avec leur utilisation de la sémantique D3DDECLUSAGE_TEXCOORD0 Et D3DDECLUSAGE_TEXCOORD1.
Réécrire le nuanceur de vertex comme suit pour éviter la collision sémantique :
vs_3_0
...
dcl_texcoord2 o3
dcl_texcoord3 o9
...
De même, un nom sémantique déclaré sur différents registres d’entrée dans le nuanceur de pixels (v0 et v1 dans le nuanceur de pixels) ne peut pas être utilisé dans un registre de sortie unique dans ce nuanceur de vertex. Par exemple, ce nuanceur de vertex ne peut pas être associé au nuanceur de pixels, car D3DDECLUSAGE_TEXCOORD1 est utilisé pour les registres d’entrée de nuanceur de pixels (v0, v1) et le registre de sortie du nuanceur de vertex o3.
vs_3_0
...
dcl_texcoord0 o3.x
dcl_texcoord1 o3.yz
dcl_texcoord2 o3.w // BAD! Would be valid if this were not o3
dcl_texcoord3 o9 ...
En revanche, ce nuanceur de vertex ne peut pas être associé au nuanceur de pixels, car le masque de sortie d’un paramètre avec une sémantique donnée ne fournit pas les données demandées par le nuanceur de pixels :
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord2 o7.yz // BAD! Would be valid if w were included
dcl_texcoord3 o9
...
Ce nuanceur de vertex ne fournit pas de sortie avec l’un des noms sémantiques demandés par le nuanceur de pixels. Par conséquent, le jumelage de nuanceurs n’est pas valide :
vs_3_0
...
dcl_texcoord0 o5.x
dcl_texcoord1 o5.yzw
dcl_texcoord3 o9
// The pixel shader wants texcoord2, with a w component,
// but it isn't output by this vertex shader at all!
...
Modifications du mode brouillard, profondeur et ombrage
Lorsque D3DRS_SHADEMODE est défini pour l’ombrage plat pendant la découpage et la rastérisation de triangle, les attributs avec D3DDECLUSAGE_COLOR sont interpolés comme ombrés plats. Si des composants d’un registre sont déclarés avec une sémantique de couleur, mais que d’autres composants du même registre reçoivent une sémantique différente, l’interpolation de trame plate (linéaire ou plate) n’est pas définie sur les composants de ce registre sans sémantique de couleur.
Si le rendu du brouillard est souhaité, vs_3_0 et ps_3_0 nuanceurs doivent implémenter le brouillard. Aucun calcul de brouillard n’est effectué en dehors des nuanceurs. Il n’existe aucun registre de brouillard dans vs_3_0, et des sémantiques supplémentaires D3DDECLUSAGE_FOG (pour le facteur de fusion de brouillard calculé par vertex) et les D3DDECLUSAGE_DEPTH (pour passer une valeur de profondeur au nuanceur de pixels pour calculer le facteur de fusion de brouillard) ont été ajoutés.
L’état de l’étape de texture D3DTSS_TEXCOORDINDEX est ignoré lors de l’utilisation du nuanceur de pixels 3.0.
Les valeurs suivantes ont été ajoutées pour prendre en charge ces modifications :
// Fog and Depth usages
D3DDECLUSAGE_FOG
D3DDECLUSAGE_DEPTH
// Additional wrap states for vs_3_0 attributes with D3DDECLUSAGE_TEXCOORD
D3DRS_WRAP8
D3DRS_WRAP9
D3DRS_WRAP10
D3DRS_WRAP11
D3DRS_WRAP12
D3DRS_WRAP13
D3DRS_WRAP14
D3DRS_WRAP15
Conversions à virgule flottante et entier
Les mathématiques à virgule flottante se produisent à différentes précisions et plages (16 bits, 24 bits et 32 bits) dans différentes parties du pipeline. Une valeur supérieure à la plage dynamique du pipeline qui entre dans ce pipeline (par exemple, une carte de texture flottante 32 bits est échantillonnée dans un pipeline float 24 bits dans ps_2_0) crée un résultat non défini. Pour un comportement prévisible, vous devez limiter une telle valeur à la plage dynamique maximale.
La conversion d’une valeur à virgule flottante en entier se produit à plusieurs endroits tels que :
- Lors de la rencontre d’une mova - vs instruction.
- Lors de l’adressage de texture.
- Lors de l’écriture dans une cible de rendu à virgule flottante.
Spécification d’une précision complète ou partielle
Les deux ps_3_0 et ps_2_x prennent en charge deux niveaux de précision :
| ps_3_0 | ps_2_0 | Précision | Valeur |
|---|---|---|---|
| x | Plein | fp32 ou version ultérieure | |
| x | Précision partielle | fp16=s10e5 | |
| x | x | Plein | fp24=s16e7 ou version ultérieure |
| x | x | Précision partielle | fp16=s10e5 |
ps_3_0 prend en charge plus de précision que ps_2_0. Par défaut, toutes les opérations se produisent au niveau de précision complet.
La précision partielle (voir modificateurs de registre de nuanceur de pixels) est demandée en ajoutant le modificateur _pp au code de nuanceur (à condition que l’implémentation sous-jacente la prend en charge). Les implémentations sont toujours libres d’ignorer le modificateur et d’effectuer les opérations affectées en toute précision.
Le modificateur _pp peut se produire dans deux contextes :
- Sur une déclaration de coordonnées de texture pour passer des coordonnées de texture de précision partielle au nuanceur de pixels. Cela peut être utilisé lorsque les coordonnées de texture relayent les données de couleur au nuanceur de pixels, ce qui peut être plus rapide avec une précision partielle que avec une précision totale dans certaines implémentations.
- Sur toutes les instructions pour demander l’utilisation d’une précision partielle, y compris les instructions de chargement de texture. Cela indique que l’implémentation est autorisée à exécuter l’instruction avec une précision partielle et à stocker un résultat de précision partielle. En l’absence d’un modificateur explicite, l’instruction doit être effectuée à pleine précision (quelle que soit la précision des opérandes d’entrée).
Une application peut choisir délibérément de compromis de précision pour les performances. Il existe plusieurs types de données d’entrée de nuanceur qui sont des candidats naturels pour le traitement de précision partielle :
- Les itérateurs de couleur sont bien représentés par des valeurs de précision partielle.
- Les valeurs de texture de la plupart des formats peuvent être représentées avec précision partielle (les valeurs échantillonnée à partir de textures de format à virgule flottante 32 bits sont une exception évidente).
- Les constantes peuvent être représentées par une représentation de précision partielle en fonction du nuanceur.
Dans tous ces cas, le développeur peut choisir de spécifier une précision partielle pour traiter les données, sachant qu’aucune précision des données d’entrée n’est perdue. Dans certains cas, un nuanceur peut exiger que les étapes internes d’un calcul soient effectuées à une précision totale même lorsque les valeurs d’entrée et de sortie finale n’ont pas plus de précision partielle.
Nuanceurs de vertex et de pixels logiciels
Les implémentations logicielles (runtime et référence pour les nuanceurs de vertex et les références pour les nuanceurs de pixels) des nuanceurs de version 2_0 et versions ultérieures ont une certaine validation assouplie. Cela est utile pour le débogage et le prototypage. L’application indique au runtime/assembleur qu’elle a besoin d’une partie de la validation assouplie à l’aide de l’indicateur de _sw dans l’assembleur (par exemple, vs_2_sw). Un nuanceur logiciel ne fonctionne pas avec du matériel.
vs_2_sw est une relaxation aux limites maximales de vs_2_x ; de même, ps_2_sw est une relaxation aux limites maximales de ps_2_x. Plus précisément, les validations suivantes sont assouplies :
| Modèle de nuanceur | Ressource | Limite |
|---|---|---|
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Nombres d’instructions | Illimité |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registres de constantes float | 8192 |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registres de constantes entières | 2048 |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Registres de constantes booléennes | 2048 |
| ps_2_sw | Profondeur de lecture dépendante | Illimité |
| vs_2_sw | instructions et étiquettes de contrôle de flux | Illimité |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Démarrage de la boucle/nombres d’étapes | La taille des étapes de début et d’itération pour les instructions de rep et de boucle est des entiers signés 32 bits. Le nombre peut être jusqu’à MAX_INT/64. |
| vs_2_sw, vs_3_sw, ps_2_sw, ps_3_sw | Limites de port | Les limites de port pour tous les fichiers d’inscription sont assouplies. |
| vs_3_sw | Nombre d’interpolateurs | 16 registres de sortie dans vs_3_sw. |
| ps_3_sw | Nombre d’interpolateurs | 14(16-2) inscriptions pour ps_3_sw. |
Rubriques connexes