#24
Message
par Bubu » mardi 22 septembre 2020 à 11:40
Le pipeline graphique dans un GPU est assez complexe.
Déjà, il n'y a pas que les shaders, il y a les rasterizers.
Les rasterizers servent à convertir la géométrie d'un triangle (3 points 3D), en une zone de pixels à colorier sur l'écran. Evidemment, cela peut être inutile si un nouveau pixel est à afficher au même endroit, mais plus proche (en profondeur).
Les rasterizers sont entre les vertex shaders et les pixels shaders.
Dans un vertex shader, on ne donne que les sommets, les normales (vecteurs orthogonaux aux surfaces), l'uv de la (ou des) texture(s).
Pour les skin meshes, personnages animés, c'est un peu plus compliqué car on fait l'interpolation de plusieurs calculs matriciels, pour donner le sommet à la suite du pipeline.
Les rasterizers, de manière invisible même bas niveau (c'est carrément géré par le materiel), interpolent ces données pour qu'elles soient utilisées par le pixel shader.
Le pixel shader rempli les triangles en couleurs. Car les GPUs ne fonctionnent qu'avec des triangles. (Normal, on peut tout faire avec des triangles)
Donc pour faire simple : Vertex Shader -> Rasterizer -> Pixel Shader.
Après c'est encore plus complexe, il y a d'autres shaders intermédiaires. Les geometry shaders et les domain shaders.
J'ai utilisé les geometry shaders pour gérer les ombres (mauvais usage il faut le dire)
Les géometry shaders génèrent de la géometrie à la volée. (ils génèrent des triangles)
Quant aux domain shaders, je n'y connais rien.
Evidemment, quand on utilise le concept de GPGPU, les rasteriseurs ne servent à rien. D'où certaines cartes de Nvidia qui n'en ont pas, et qui n'ont même pas de port video. Mais elles sont féroces en performance. Uniquement conçues pour le calcul massivement parallèle. (via CUDA, ou OpenCl)
Les shaders sont unifiés depuis longtemps, c'est à dire que tous les shaders sont exécutables par les mêmes unités de calcul.
Les unités de calcul d'un GPU sont des monstres. Elles ont des registres de 128 bits. Soit 4 float, (voire 2 double mais c'est jamais utilisé dans les jeux), donc un registre, c'est un vecteur de 4 flottants.
Ensuite elles gèrent les matrices (4x4) sous forme de palettes locales, donc vous imaginez un peu le potentiel de calcul de ces unités. Ensuite, elles sont par centaines, voire par milliers.
Et ces unités de calcul gèrent absolument toutes les fonctions. (addition, soustraction, multiplication, division, logarithme, exponentielle, cosinus, sinus, tangente, etc). En plus des "intrinsic" qui permettent de calculer la réflexion d'un vecteur ou sa réfraction, la normalisation d'un vecteur (essentiel), etc... Mais je pense que c'est, au niveau assembleur, une suite d'instructions les "intrinsics".
A vérifier.
Donc les CPUs, peuvent aller se coucher malgré leur gestion de SIMD, ils ne font pas le poids face à la puissance de calcul phénoménale des GPUs. Normal, sinon on en aurait pas besoin.
Je crois que mes blabla méritent bien une petite croquette à la choucroute gratinée.
TSA, diagnostic établi à mes 33 ans par le CRA de ma région.
"Ce syndrome est caractérisé chez ce patient par l’absence de détérioration intellectuelle, un syndrome dysexécutif, un déficit d'attention"