Le coût pratique des effets d'échange

16

J'utilise XNA pour mes projets et sur ces forums, je vois parfois des références au fait que l'échange d'un effet pour un maillage a un coût relativement élevé, ce qui me surprend car je pensais que l'échange d'un effet était simplement un cas de copie du programme de remplacement de shader au GPU avec les paramètres appropriés.

Je me demandais si quelqu'un pourrait expliquer exactement ce qui coûte cher dans ce processus? Et si possible, mettre «relativement» en contexte?

Par exemple, disons que je voulais utiliser un shader court pour aider à la cueillette, je voudrais:

  1. Modifiez l'effet sur chaque objet, en calculant une couleur unique pour l'identifier et en la fournissant au shader.
  2. Dessinez tous les objets sur une cible de rendu en mémoire.
  3. Obtenez la couleur de la cible et utilisez-la pour rechercher l'objet sélectionné.

Quelle partie du temps total nécessaire pour terminer ce processus serait consacrée à l'échange des shaders? Mes instincts diraient que rendre la scène à nouveau, peu importe la simplicité du shader, serait un ordre de grandeur plus lent que toute autre partie du processus, alors pourquoi tout le souci des effets?

sebf
la source

Réponses:

21

Le problème que vous décrivez n'est pas un problème "spécial". Il n'y a rien de particulièrement lent à changer les effets sur le GPU. Le problème avec la modification des effets, des paramètres d'effets (y compris les transformations), des textures, des différents états de rendu et de l'envoi simple de plusieurs commandes de dessin, est qu'il nécessite qu'un autre lot soit envoyé au GPU .

Les lots sont liés au processeur et vous n'utilisez que quelques milliers * par image à utiliser.

Cela dépend du CPU et des autres travaux que vous effectuez, mais disons que vous obtenez environ 1000 lots par image. Si vous rendez un objet par lot, vous pouvez dessiner environ 1000 objets à l'écran avant de rencontrer des problèmes.

Si vous ajoutez soudainement du picking et que vous devez rendre tous vos objets deux fois, vous êtes limité à dessiner seulement 500 objets.

(Donc, si vous n'avez qu'un petit nombre d'objets, ne vous en faites pas!)

Pour réduire le nombre de lots que vous utilisez, vous devez essentiellement "être intelligent" à ce sujet. La méthode prototypique pour ce faire est de combiner intelligemment plusieurs objets en un seul lot. En particulier, recherchez " instancing ". Vous pouvez peut-être utiliser le numéro d'instance pour attribuer une couleur unique à chaque objet de votre shader.

Une autre technique, particulièrement adaptée à la cueillette, consiste à éliminer les objets rendus dans le logiciel afin que vous ne rendiez pas tout ce que vous savez ne touche pas votre pixel sélectionné.

Voici un diaporama de présentation complet de NVidia intitulé "Lot, lot, lot: qu'est-ce que cela signifie vraiment?" (PDF) qui a de beaux graphiques et des trucs expliquant cela. Il répertorie également certaines techniques pour réduire le nombre de lots.

Andrew Russell
la source
D'accord! Merci pour l'explication et les suggestions, ce que je lis a beaucoup plus de sens maintenant. Merci également pour la présentation de NVidia, je viens de la lire maintenant et c'est très utile.
sebf
1
Lien mis à jour vers le document «Lot, lot, lot»: ce.u-sys.org/Veranstaltungen/…
Marton
1
Merci Marton, j'ai édité le nouveau lien dans le message :)
Andrew Russell