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 phases de nuanceur (vertex, géométrie et pixels) 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 du nuanceur commun et les ressources de mémoire du nuanceur.

diagram of data flow in a shader stage

  • Données d’entrée : un nuanceur de vertex reçoit ses entrées de l’étape 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 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 à transmettre à l’étape suivante du pipeline. Pour un nuanceur de géométrie, la quantité de données générée par un appel unique peut varier. Certaines sorties sont interprétées par le cœur du nuanceur commun (tel que 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 des entiers 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 phase de nuanceur. Ils sont conçus pour une mise à jour plus fréquente à partir de l’UC ; 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 fichier d’enregistrement de constante unique et petit pour stocker toutes les variables de nuanceur de constantes. L’accommodement 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.

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 les entrées de flux Direct3D 9 marquées comme entiers dans HLSL, elles ont été interprétées comme étant à 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 de bits

Le cœur du nuanceur commun prend en charge les opérateurs au niveau du bit suivants :

Opérateur Fonction
~ NOT logique
<< Maj gauche
>> Maj droite
& AND logique
| Or logique
^ Xor logique
<<= Décalage gauche égal à
>>= Décalage droit égal à
&= Et égal à
|= Ou égal à
^= Xor Égal à

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 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

La conversion 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 à partir d’un float, en int, et de retour à 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.

Modèle de nuanceur 4