Common-Shader Core
Dans le modèle de nuanceur 4, toutes les étapes du nuanceur implémentent la même fonctionnalité de base à l’aide d’un cœur de nuanceur commun. En outre, chacune des trois étapes du nuanceur (vertex, geometry et pixel) offre des fonctionnalités propres à chaque étape, telles que la possibilité de générer de nouvelles primitives à partir de l’étape du nuanceur de géométrie ou d’ignorer un pixel spécifique dans l’étape du nuanceur de pixels. Le diagramme suivant montre comment les données transitent par une étape de nuanceur, et la relation entre le cœur common-shader et les ressources de mémoire du nuanceur.
- Données d’entrée : un nuanceur de vertex reçoit ses entrées de la phase d’assembleur d’entrée ; Les nuanceurs de géométrie et de pixels reçoivent leurs entrées de l’étape précédente du nuanceur. Les entrées supplémentaires incluent la sémantique de valeur système, qui est consommable par la première unité du pipeline à laquelle elles s’appliquent.
- Données de sortie : les nuanceurs génèrent des résultats de sortie à passer à l’étape suivante dans le pipeline. Pour un nuanceur de géométrie, la quantité de données sorties d’un appel unique peut varier. Certaines sorties sont interprétées par le noyau common-shader (par exemple, la position du vertex et l’index render-target-array), d’autres sont conçues pour être interprétées par une application.
- Code du nuanceur : les nuanceurs peuvent lire à partir de la mémoire, effectuer des opérations arithmétiques à virgule flottante vectorielle et entière, ou des opérations de contrôle de flux. Il n’existe aucune limite au nombre d’instructions qui peuvent être implémentées dans un nuanceur.
- Échantillonneurs : les échantillonneurs définissent comment échantillonner et filtrer des textures. Jusqu’à 16 échantillonneurs peuvent être liés simultanément à un nuanceur.
- Textures : les textures peuvent être filtrées à l’aide d’échantillonneurs ou lues par texel directement avec la fonction intrinsèque de charge .
- Mémoires tampons : les mémoires tampons ne sont jamais filtrées, mais peuvent être lues à partir de la mémoire par élément directement avec la fonction intrinsèque de charge . Jusqu’à 128 ressources de texture et de mémoire tampon (combinées) peuvent être liées simultanément à un nuanceur.
- Mémoires tampons constantes : les mémoires tampons constantes sont optimisées pour les variables constantes du nuanceur. Jusqu’à 16 mémoires tampons constantes peuvent être liées simultanément à une étape de nuanceur. Ils sont conçus pour des mises à jour plus fréquentes à partir du processeur ; par conséquent, ils ont des restrictions de taille, de disposition et d’accès supplémentaires.
Différences entre Direct3D 9 et Direct3D 10 :
- Dans Direct3D 9, chaque unité de nuanceur avait un seul petit fichier de registre de constantes pour stocker toutes les variables de nuanceur constant. L’adaptation de tous les nuanceurs avec cet espace constant limité nécessitait un recyclage fréquent des constantes par le processeur.
- Dans Direct3D 10, les constantes sont stockées dans des mémoires tampons immuables et sont gérées comme n’importe quelle autre ressource. Il n’existe aucune limite au nombre de mémoires tampons constantes qu’une application peut créer. En organisant les constantes en mémoires tampons par fréquence de mise à jour et d’utilisation, la quantité de bande passante nécessaire à la mise à jour des constantes pour prendre en charge tous les nuanceurs peut être considérablement réduite.
Prise en charge des entiers et du bit
Le cœur de nuanceur commun fournit un ensemble complet d’opérations d’entier 32 bits conformes à l’IEEE et au niveau du bit. Ces opérations activent une nouvelle classe d’algorithmes dans les exemples de matériel graphique, notamment les techniques de compression et d’empaquetage, les FFT et le contrôle de flux de programme de champ de bits.
Les types de données int et uint dans Direct3D 10 HLSL sont mappés à des entiers 32 bits dans le matériel.
Différences entre Direct3D 9 et Direct3D 10 : Dans Direct3D 9, les entrées de flux marquées comme entier dans HLSL ont été interprétées comme à virgule flottante. Dans Direct3D 10, les entrées de flux marquées comme entières sont interprétées comme un entier 32 bits. En outre, les valeurs booléennes sont désormais tous les bits définis ou tous les bits non définis. Les données converties en bool sont interprétées comme vraies si la valeur n’est pas égale à 0,0f (zéro positif et négatif sont autorisés à être false) et false dans le cas contraire. |
Opérateurs de bits
Le cœur de nuanceur commun prend en charge les opérateurs au niveau du bit suivants :
Opérateur | Fonction |
---|---|
~ | NOT logique |
<< | Maj gauche |
>> | Décalage vers la droite |
& | AND logique |
| | Or logique |
^ | Xor logique |
<<= | Décalage gauche Égal |
>>= | Décalage vers la droite égal |
&= | Et égal à |
|= | Ou égal à |
^= | Xor Equal |
Les opérateurs au niveau du bit sont définis pour fonctionner uniquement sur les types de données int et uint . Toute tentative d’utilisation d’opérateurs au niveau du bit sur des types de données float ou struct génère une erreur. Les opérateurs au niveau du bit suivent la même priorité que C par rapport aux autres opérateurs.
Casts binaires
Le cast entre un entier et un type à virgule flottante convertit la valeur numérique en suivant les règles de troncation C. Le cast d’une valeur d’un float en int et de retour en valeur float est une conversion avec perte qui dépend de la précision du type de données cible. Voici quelques-unes des fonctions de conversion : asfloat (DirectX HLSL),asint (DirectX HLSL), asuint (DirectX HLSL).
Les casts binaires peuvent également être effectués à l’aide de fonctions intrinsèques HLSL. En conséquence, le compilateur réinterprète la représentation en bits d’un nombre dans le type de données cible.