Optimisation des nuanceurs HLSL

Cette section décrit les stratégies à usage général que vous pouvez utiliser pour optimiser vos nuanceurs. Vous pouvez appliquer ces stratégies aux nuanceurs écrits dans n’importe quelle langue, sur n’importe quelle plateforme.

Savoir où effectuer des calculs de nuanceur

Les nuanceurs de vertex effectuent des opérations qui incluent l’extraction des sommets et la transformation de matrice des données de vertex. En règle générale, les nuanceurs de vertex sont exécutés une fois par sommet.

Les nuanceurs de pixels effectuent des opérations qui incluent l’extraction des données de texture et l’exécution de calculs d’éclairage. En règle générale, les nuanceurs de pixels sont exécutés une fois par pixel pour un morceau de géométrie donné.

En règle générale, les pixels dépassent les sommets d’une scène, de sorte que les nuanceurs de pixels s’exécutent plus souvent que les nuanceurs de vertex.

Lorsque vous concevez des algorithmes de nuanceur, gardez à l’esprit les points suivants :

  • Si possible, effectuez des calculs sur le nuanceur de vertex. Un calcul effectué sur un nuanceur de pixels est beaucoup plus coûteux qu’un calcul effectué sur un nuanceur de vertex.
  • Envisagez d’utiliser des calculs par vertex pour améliorer les performances dans des situations telles que les maillages denses. Pour les maillages denses, les calculs par vertex peuvent produire des résultats visuellement indistinguibles des résultats produits avec des calculs par pixel.

Ignorer les instructions inutiles

Dans HLSL, la création de branches dynamiques permet de limiter le nombre d’instructions exécutées. Par conséquent, la création de branches dynamiques peut aider à accélérer le temps d’exécution du nuanceur. Si la géométrie ou les pixels ne sont pas affichés, utilisez la branche dynamique pour quitter le nuanceur ou pour limiter les instructions. Par exemple, si un pixel n’est pas allumé, l’exécution de l’algorithme d’éclairage ne sert à rien.

Le tableau suivant répertorie certains cas dans lesquels vous pouvez tester des conditions dans votre nuanceur et utiliser la création de branches dynamiques pour ignorer les instructions inutiles. Le tableau n’est pas complet. Il est plutôt destiné à vous donner des idées pour optimiser votre code.

Condition à vérifier Réponse dans le nuanceur
Alpha case activée détermine qu’aucun pixel ne sera visible. Ignorez le reste du nuanceur.
Le pixel ou la géométrie est entièrement journalisé. Ignorez le reste du nuanceur.
Les poids de peau sont nuls. Sauter les os.
L’atténuation de la lumière est égale à zéro. Ignorez l’éclairage.
Terme lambertien non positif. Ignorez l’éclairage.

 

Variables et interpolants de pack

Gardez à l’esprit l’espace requis pour les données du nuanceur. Empaquetez autant d’informations que possible dans une variable ou un interpolant. Parfois, les informations de deux variables peuvent être regroupées dans l’espace mémoire d’une seule variable.

Réduire la complexité du nuanceur

Gardez vos nuanceurs petits et simples. En général, les nuanceurs avec moins d’instructions s’exécutent plus rapidement que les nuanceurs avec plus d’instructions. Il est également plus facile de déboguer et d’optimiser des nuanceurs plus petits et moins complexes.

Guide de programmation pour HLSL

Guide de programmation pour HLSL