Quand est-il préférable de télécharger des matrices de modèle partielles dans le vertex shader?

8

À partir de maintenant, lors du rendu de ma scène et lors de l'itération dans le graphique de la scène, pour chaque nœud, sa matrice de modèle est calculée à partir de la matrice de modèle du parent et de la pose du nœud de scène. Ceci est assez simple et réduit déjà le nombre de multiplications matricielles à une multiplication par nœud et trame.

Mais toutes ces multiplications matricielles doivent être effectuées sur le CPU et dans chaque image pour pouvoir effectuer des mouvements (multiples consécutifs) de nœuds de scène très rapidement. Le GPU, cependant, est probablement beaucoup mieux adapté pour effectuer de nombreuses multiplications matricielles, donc je pense à envoyer plusieurs matrices de modèles partiels au vertex shader au lieu de tout calculer sur le CPU.

L'envoi de chaque partie (donc la pose de chaque nœud) au GPU n'a probablement pas beaucoup de sens, car dans ce cas, tous les calculs sont effectués pour chaque sommet au lieu de chaque nœud, ce qui diminuerait en fait les performances. Mais peut-être que les nœuds de scène avec beaucoup d'enfants ou seulement des enfants immobiles (par rapport à son parent) pourraient être un endroit pour diviser la matrice du modèle et déplacer les multiplications vers le shader.

Alors, quand est-il préférable d'envoyer des matrices de modèle partielles au shader et de déplacer la multiplication vers le GPU? Ou est-ce simplement une mauvaise idée?

Nero
la source

Réponses:

9

Faire des maths avec des uniformes est un shader qui ne vous donnera généralement aucune performance par rapport au CPU. Un CPU n'est pas plus lent qu'un GPU à faire des mathématiques matricielles, il n'est tout simplement pas structuré de manière à faire de grandes quantités de mathématiques en parallèle. Mais vous devez réellement faire cette grande quantité de calculs pour obtenir une victoire. L'envoi de données supplémentaires au GPU juste pour que le GPU multiplie deux matrices ensemble ne vous rapportera rarement rien.

Maintenant, disons que vous avez un tampon de matrices de skinning. Cela peut commencer à avoir de l'importance que vous les transformiez tous en espace mondial sur le processeur ou que vous passiez simplement une matrice supplémentaire de modèle à espace mondial au GPU. Mais même dans ce cas, cela dépend de votre rapport des sommets aux os.

John Calsbeek
la source
Je dépend de la quantité de calculs.GPU est vraiment rapide sur les opérations mathématiques.Il s'agit donc d'essayer et de comparer.
Michael IV du
5

Rarement, sinon jamais. Vous y avez répondu à moitié dans votre propre question: un vertex shader s'exécute une fois par vertex, un fragment shader une fois par fragment. Si vous ne faites pas quelque chose d'unique à ce sommet ou à ce fragment, vous faites exactement la même chose chaque fois que vous invoquez un shader. Cela ne me semble pas plus efficace.

Mokosha
la source