Common-Shader Core
Dans le modèle de nuanceur 4, toutes les étapes de 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 (sommet, géométrie et pixel) offre des fonctionnalités uniques à 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 circulent à travers une étape de nuanceur et la relation entre le cœur du nuanceur commun et les ressources de mémoire du nuanceur.
diagramme
- données d’entrée : un nuanceur de vertex reçoit ses entrées de la phase d’assembleur d’entrée ; les nuanceurs geometry et pixels reçoivent leurs entrées de l’étape précédente du nuanceur. Les entrées supplémentaires incluent sémantique de valeur système, qui sont consommables par la première unité du pipeline auquel elles s’appliquent.
- données de sortie: les nuanceurs génèrent des résultats de sortie à passer à l’étape suivante du pipeline. Pour un nuanceur géométrique, la quantité de données de sortie d’un appel unique peut varier. Certaines sorties sont interprétées par le cœur du nuanceur commun (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 de nuanceur: les nuanceurs peuvent lire à partir de la mémoire, effectuer des opérations arithmétiques à virgule flottante et entière vectorielle 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.
- samplers: 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 directement avec la charge fonction intrinsèque.
- mémoires tampons: les mémoires tampons ne sont jamais filtrées, mais peuvent être lues directement à partir de la mémoire par élément avec la charge fonction intrinsèque. 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 une mise à jour plus fréquente à partir du processeur ; par conséquent, ils ont des restrictions supplémentaires de taille, de disposition et d’accès.
Différences entre Direct3D 9 et Direct3D 10 :
- Dans Direct3D 9, chaque unité de nuanceur avait un fichier d’enregistrement de constante unique et petit pour stocker toutes les variables de nuanceur constantes. L’adaptation de tous les nuanceurs avec cet espace constant limité nécessite 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 des constantes en mémoires tampons par fréquence de mise à jour et d’utilisation, la quantité de bande passante requise pour mettre à jour les constantes pour prendre en charge tous les nuanceurs peut être considérablement réduite.
Prise en charge des entiers et des bits
Le cœur du nuanceur commun fournit un ensemble complet d’opérations d’entier 32 bits conformes à l’IEEE et au niveau du bit. Ces opérations permettent une nouvelle classe d’algorithmes dans des exemples de matériel graphique, notamment les techniques de compression et d’emballage, les FFT et le contrôle de flux de programme de champ de bits.
Le int et uint types de données dans Direct3D 10 HLSL mappé à des entiers 32 bits dans le matériel.
Différences entre Direct3D 9 et Direct3D 10 : Dans les entrées de flux Direct3D 9 marquées comme entiers dans HLSL ont été interprétées comme à virgule flottante. Dans Direct3D 10, les entrées de flux marquées comme entier sont interprétées comme un entier 32 bits. En outre, les valeurs booléennes sont désormais toutes les bits définies 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ées à être false) et false dans le cas contraire. |
Opérateurs au niveau du bit
Le cœur de nuanceur commun prend en charge les opérateurs au niveau du bit suivants :
Opérateur | Fonction |
---|---|
~ | Logique non |
<< | Maj gauche |
>> | Maj droite |
& | Logique et |
| | Logique ou |
^ | Xor logique |
<<= | Décalage gauche égal |
>>= | Décalage droit égal |
&= | Et égal |
|= | Ou égal à |
^= | Xor Equal |
Les opérateurs au niveau du bit sont définis pour fonctionner uniquement sur des types de données int et uint. Toute tentative d’utilisation d’opérateurs au niveau du bit sur float ou struct types de données entraîne une erreur. Les opérateurs au niveau du bit suivent la même priorité que C en ce qui concerne d’autres opérateurs.
Casts binaires
Le cast entre un entier et un type à virgule flottante convertit la valeur numérique suivant les règles de troncation C. La conversion d’une valeur d’un float, vers un int, et revenir à un float est une conversion de perte dépendante 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. Le compilateur réinterprète la représentation binaire d’un nombre dans le type de données cible.
Rubriques connexes
-
modèle nuanceur 4