Le pipeline d'infographie , également connu sous le nom de pipeline de rendu ou pipeline graphique , est un cadre au sein de l'infographie qui décrit les procédures nécessaires pour transformer une scène tridimensionnelle (3D) en une représentation bidimensionnelle (2D) sur un écran. Une fois qu'un modèle 3D est généré, le pipeline graphique convertit le modèle en un format visuellement perceptible sur l'écran de l'ordinateur. En raison de la dépendance à des logiciels spécifiques , des configurations matérielles et des attributs d'affichage souhaités, un pipeline graphique universellement applicable n'existe pas. Néanmoins, des interfaces de programmation d'applications graphiques (API), telles que Direct3D , OpenGL et Vulkan, ont été développées pour normaliser les procédures courantes et superviser le pipeline graphique d'un accélérateur matériel donné. Ces API fournissent une couche d'abstraction sur le matériel sous-jacent, soulageant les programmeurs de la nécessité d'écrire du code ciblant explicitement divers accélérateurs matériels graphiques comme AMD , Intel , Nvidia et autres.
Le modèle de pipeline graphique est généralement utilisé dans le rendu en temps réel. Souvent, la plupart des étapes du pipeline sont implémentées au niveau du matériel, ce qui permet des optimisations spéciales . Le terme « pipeline » est utilisé dans un sens similaire pour le pipeline dans les processeurs : les différentes étapes du pipeline s'exécutent en parallèle tant qu'une étape donnée a ce dont elle a besoin.
Concept
Le pipeline 3D fait généralement référence à la forme la plus courante de rendu tridimensionnel par ordinateur appelée rendu polygonal 3D , distincte du Raytracing et du Raycasting . Dans le Raycasting, un rayon provient du point où se trouve la caméra, et si ce rayon touche une surface, la couleur et l'éclairage du point de la surface où le rayon touche sont calculés. Dans le rendu polygonal 3D, l'inverse se produit : la zone donnée à la caméra est calculée, puis des rayons sont créés à partir de chaque partie de chaque surface donnée à la caméra et tracés jusqu'à la caméra.
Structure
Un pipeline graphique peut être divisé en trois parties principales : application, géométrie et rastérisation.
Application
L'étape d'application est exécutée par le logiciel sur le processeur principal ( CPU ). Au cours de l'étape d'application, des modifications sont apportées à la scène selon les besoins, par exemple par l'interaction de l'utilisateur à l'aide de périphériques d'entrée ou lors d'une animation. La nouvelle scène avec toutes ses primitives , généralement des triangles, des lignes et des points, est ensuite transmise à l'étape suivante du pipeline.
Les exemples de tâches généralement effectuées au cours de l'étape d'application sont la détection de collision , l'animation, le morphing et les techniques d'accélération utilisant des schémas de subdivision spatiale tels que les Quadtrees ou les Octrees . Ces techniques sont également utilisées pour réduire la quantité de mémoire principale requise à un moment donné. Le « monde » d'un jeu informatique moderne est bien plus vaste que ce que la mémoire peut contenir en une seule fois.
Géométrie
L'étape de géométrie (avec pipeline Géométrie ), qui est responsable de la majorité des opérations avec les polygones et leurs sommets (avec pipeline Vertex ), peut être divisée en cinq tâches suivantes. La manière dont ces tâches sont organisées en tant qu'étapes de pipeline parallèles réelles dépend de l'implémentation particulière.
Définitions
Un sommet (au pluriel : sommets) est un point du monde. De nombreux points sont utilisés pour joindre les surfaces. Dans des cas particuliers, les nuages de points sont dessinés directement, mais cela reste une exception.
Un triangle est la primitive géométrique la plus courante en infographie. Il est défini par ses trois sommets et un vecteur normal - le vecteur normal sert à indiquer la face avant du triangle et est un vecteur perpendiculaire à la surface. Le triangle peut être doté d'une couleur ou d'une texture (image "collée" dessus). Les triangles sont préférés aux rectangles car leurs trois points existent toujours dans un seul plan .
Le système de coordonnées mondial
Le système de coordonnées mondial est le système de coordonnées dans lequel le monde virtuel est créé. Il doit répondre à quelques conditions pour que les mathématiques suivantes soient facilement applicables :
- Il doit s'agir d'un système de coordonnées cartésiennes rectangulaires dans lequel tous les axes sont mis à l'échelle de manière égale.
La définition de l'unité du système de coordonnées est laissée à l'initiative du développeur. Ainsi, selon l'application , le vecteur unitaire du système correspondra en réalité à un mètre ou à un Ångström .
- Le choix d'utiliser un système de coordonnées droitier ou gaucher peut être déterminé par la bibliothèque graphique à utiliser.
- Exemple : Si nous devons développer un simulateur de vol, nous pouvons choisir le système de coordonnées mondial de telle sorte que l'origine se trouve au milieu de la Terre et que l'unité soit fixée à un mètre. De plus, pour faciliter la référence à la réalité, nous définissons que l'axe X doit couper l'équateur au méridien zéro et que l'axe Z passe par les pôles. Dans un système droitier, l'axe Y passe par le méridien 90° Est (quelque part dans l' océan Indien ). Nous disposons désormais d'un système de coordonnées qui décrit chaque point de la Terre en coordonnées cartésiennes tridimensionnelles . Dans ce système de coordonnées, nous modélisons maintenant les principes de notre monde, les montagnes, les vallées et les océans.
- Remarque : Outre la géométrie informatique, les coordonnées géographiques sont utilisées pour la Terre , c'est-à-dire la latitude et la longitude , ainsi que les altitudes au-dessus du niveau de la mer. La conversion approximative - si l'on ne tient pas compte du fait que la Terre n'est pas une sphère exacte - est simple :
- Tous les exemples suivants s'appliquent à un système pour droitiers. Pour un système pour gauchers, il peut être nécessaire d'intervertir les signes.
Les objets contenus dans la scène (maisons, arbres, voitures) sont souvent conçus dans leur système de coordonnées d'objet (également appelé système de coordonnées de modèle ou système de coordonnées local) pour des raisons de simplification de la modélisation. Pour attribuer ces objets à des coordonnées dans le système de coordonnées mondial ou le système de coordonnées global de la scène entière, les coordonnées de l'objet sont transformées par translation, rotation ou mise à l'échelle. Cela se fait en multipliant les matrices de transformation correspondantes . De plus, plusieurs copies transformées différemment peuvent être formées à partir d'un objet, par exemple une forêt à partir d'un arbre ; cette technique est appelée instanciation.
- Pour placer un modèle d'avion dans le monde, nous déterminons d'abord quatre matrices. Comme nous travaillons dans un espace tridimensionnel, nous avons besoin de matrices homogènes à quatre dimensions pour nos calculs.
Tout d’abord, nous avons besoin de trois matrices de rotation , à savoir une pour chacun des trois axes de l’avion (axe vertical, axe transversal, axe longitudinal).
- Autour de l'axe X (généralement défini comme un axe longitudinal dans le système de coordonnées de l'objet)
- Autour de l'axe Y (généralement défini comme l'axe transversal dans le système de coordonnées de l'objet)
- Autour de l'axe Z (généralement défini comme un axe vertical dans le système de coordonnées de l'objet)
Nous utilisons également une matrice de translation qui déplace l'avion vers le point souhaité dans notre monde : .
- Remarque : Les matrices ci-dessus sont transposées par rapport à celles de la matrice de rotation de l'article . Voir plus bas pour une explication de la raison.
Nous pourrions maintenant calculer la position des sommets de l'avion en coordonnées mondiales en multipliant chaque point successivement par ces quatre matrices. Comme la multiplication d'une matrice par un vecteur est assez coûteuse (prend du temps), on prend généralement un autre chemin et on multiplie d'abord les quatre matrices ensemble. La multiplication de deux matrices est encore plus coûteuse mais ne doit être exécutée qu'une seule fois pour l'objet entier. Les multiplications et sont équivalentes. Ensuite, la matrice résultante pourrait être appliquée aux sommets. En pratique, cependant, la multiplication avec les sommets n'est toujours pas appliquée, mais les matrices de caméra (voir ci-dessous) sont déterminées en premier.
- Pour notre exemple ci-dessus, cependant, la traduction doit être déterminée un peu différemment, car la signification courante de up - à part au pôle Nord - ne coïncide pas avec notre définition de l'axe Z positif et donc le modèle doit également être tourné autour du centre de la Terre : La première étape pousse l'origine du modèle à la bonne hauteur au-dessus de la surface de la Terre, puis il est tourné en fonction de la latitude et de la longitude.
L'ordre dans lequel les matrices sont appliquées est important car la multiplication matricielle n'est pas commutative . Cela s'applique également aux trois rotations, ce qui peut être démontré par un exemple : le point (1, 0, 0) se trouve sur l'axe X, si on le fait d'abord tourner de 90° autour de l'axe X puis autour de l'axe Y, il se retrouve sur l'axe Z (la rotation autour de l'axe X n'affecte pas un point qui se trouve sur l'axe). Si, par contre, on fait d'abord tourner autour de l'axe Y puis autour de l'axe X, le point résultant se trouve sur l'axe Y. La séquence elle-même est arbitraire tant qu'elle est toujours la même. La séquence avec x, puis y, puis z (roulis, tangage, cap) est souvent la plus intuitive car la rotation fait coïncider la direction de la boussole avec la direction du "nez".
Il existe également deux conventions pour définir ces matrices, selon que vous souhaitez travailler avec des vecteurs colonnes ou des vecteurs lignes. Les différentes bibliothèques graphiques ont ici des préférences différentes. OpenGL préfère les vecteurs colonnes, DirectX les vecteurs lignes. La décision détermine de quel côté les vecteurs de points doivent être multipliés par les matrices de transformation. Pour les vecteurs colonnes, la multiplication est effectuée à partir de la droite, c'est-à-dire où v out et v in sont des vecteurs colonnes 4x1. La concaténation des matrices est également effectuée de droite à gauche, c'est-à-dire par exemple lors de la première rotation puis du décalage.
Dans le cas des vecteurs lignes, cela fonctionne exactement dans l'autre sens. La multiplication se fait maintenant à partir de la gauche comme pour les vecteurs lignes 1x4 et la concaténation se fait également lorsque nous faisons d'abord pivoter puis déplaçons. Les matrices présentées ci-dessus sont valables pour le deuxième cas, tandis que celles des vecteurs colonnes sont transposées. La règle s'applique, ce qui signifie que pour la multiplication avec des vecteurs, vous pouvez changer l'ordre de multiplication en transposant la matrice.
Dans le chaînage de matrices, chaque transformation définit un nouveau système de coordonnées, ce qui permet des extensions flexibles. Par exemple, l'hélice d'un avion, modélisée séparément, peut être attachée au nez de l'avion par translation, ce qui ne fait que passer du modèle au système de coordonnées de l'hélice. Pour restituer l'avion, sa matrice de transformation est d'abord calculée pour transformer les points, puis la matrice du modèle d'hélice est multipliée par la matrice de l'avion pour les points d'hélice. Cette matrice calculée est connue sous le nom de « matrice mondiale », essentielle pour chaque objet de la scène avant le rendu. L'application peut ensuite modifier dynamiquement ces matrices, par exemple en mettant à jour la position de l'avion à chaque image en fonction de la vitesse.
La matrice ainsi calculée est également appelée matrice du monde . Elle doit être déterminée pour chaque objet du monde avant le rendu. L'application peut y apporter des modifications, par exemple en modifiant la position de l'avion en fonction de la vitesse après chaque image.
Transformation de la caméra

En plus des objets, la scène définit également une caméra virtuelle ou une visionneuse qui indique la position et la direction de la vue par rapport à laquelle la scène est rendue. La scène est transformée de sorte que la caméra soit à l'origine en regardant le long de l'axe Z. Le système de coordonnées résultant est appelé système de coordonnées de la caméra et la transformation est appelée transformation de la caméra ou transformation de la vue .
- La matrice de vue est généralement déterminée à partir de la position de la caméra, du point cible (vers lequel la caméra regarde) et d'un « vecteur vers le haut » (« vers le haut » du point de vue du spectateur). Les trois premiers vecteurs auxiliaires sont requis :
Zaxis = normal(cameraPosition - cameraTarget)Xaxis = normal(cross(cameraUpVector, Zaxis))Yaxis = cross(Zaxis, Xaxis )- Avec normal(v) = normalisation du vecteur v ;
- cross(v1, v2) = produit vectoriel de v1 et v2.
- Enfin, la matrice :
- avec dot(v1, v2) = produit scalaire de v1 et v2.
Projection
L' étape de projection 3D transforme le volume de vue en un cube avec les coordonnées des points d'angle (-1, -1, 0) et (1, 1, 1) ; d'autres volumes cibles sont parfois également utilisés. Cette étape est appelée projection , même si elle transforme un volume en un autre volume, car les coordonnées Z résultantes ne sont pas enregistrées dans l'image, mais sont uniquement utilisées dans la mise en mémoire tampon Z lors de l'étape de rastering ultérieure. Dans une illustration en perspective , une projection centrale est utilisée. Pour limiter le nombre d'objets affichés, deux plans de découpage supplémentaires sont utilisés ; le volume visuel est donc une pyramide tronquée ( frustum ). La projection parallèle ou orthogonale est utilisée, par exemple, pour les représentations techniques, car elle présente l'avantage que tous les parallèles dans l'espace objet sont également parallèles dans l'espace image et que les surfaces et les volumes ont la même taille quelle que soit la distance par rapport au spectateur. Les cartes utilisent par exemple une projection orthogonale (appelée orthophotographie ), mais les images obliques d'un paysage ne peuvent pas être utilisées de cette manière - bien qu'elles puissent techniquement être rendues, elles semblent si déformées que nous ne pouvons pas les utiliser. La formule de calcul d'une matrice de cartographie en perspective est la suivante :
- Avec h = cot (fieldOfView / 2.0) (angle d'ouverture de la caméra) ; w = h / aspect Ratio (rapport hauteur/largeur de l'image cible) ; near = La plus petite distance pour être visible ; far = La plus longue distance pour être visible.
Les raisons pour lesquelles la plus petite et la plus grande distance doivent être indiquées ici sont, d'une part, que cette distance est divisée pour atteindre la mise à l'échelle de la scène (les objets plus éloignés sont plus petits dans une image en perspective que les objets proches), et d'autre part pour mettre à l'échelle les valeurs Z dans la plage 0..1, pour remplir le tampon Z. Ce tampon n'a souvent qu'une résolution de 16 bits, c'est pourquoi les valeurs proches et éloignées doivent être choisies avec soin. Une différence trop importante entre la valeur proche et la valeur éloignée conduit à ce que l'on appelle un Z-fighting en raison de la faible résolution du tampon Z. On peut également voir à partir de la formule que la valeur proche ne peut pas être 0 car ce point est le point focal de la projection. Il n'y a pas d'image à ce point.
Par souci d'exhaustivité, la formule de la projection parallèle (projection orthogonale) :
- avec w = largeur du cube cible (dimension en unités du système de coordonnées mondial) ; H = w / rapport hauteur/largeur (rapport hauteur/largeur de l'image cible) ; proche = plus petite distance pour être visible ; loin = plus longue distance pour être visible.
Pour des raisons d'efficacité, la matrice de caméra et la matrice de projection sont généralement combinées dans une matrice de transformation, de sorte que le système de coordonnées de la caméra est supprimé. La matrice résultante est généralement la même pour une seule image, tandis que la matrice du monde est différente pour chaque objet. Dans la pratique, la vue et la projection sont donc précalculées de sorte que seule la matrice du monde doit être adaptée lors de l'affichage. Des transformations plus complexes telles que le vertex blending sont toutefois possibles. Des shaders de géométrie librement programmables qui modifient la géométrie peuvent également être exécutés.
Dans l'étape de rendu proprement dite, la matrice du monde * matrice de la caméra * matrice de projection est calculée puis finalement appliquée à chaque point individuel. Ainsi, les points de tous les objets sont transférés directement dans le système de coordonnées de l'écran (au moins presque, la plage de valeurs des axes est toujours de -1..1 pour la plage visible, voir la section « Transformation fenêtre-fenêtre »).
Éclairage
Souvent, une scène contient des sources lumineuses placées à différentes positions pour rendre l'éclairage des objets plus réaliste. Dans ce cas, un facteur de gain pour la texture est calculé pour chaque sommet en fonction des sources lumineuses et des propriétés matérielles associées au triangle correspondant. Dans l'étape de rastérisation ultérieure, les valeurs des sommets d'un triangle sont interpolées sur sa surface. Un éclairage général (lumière ambiante) est appliqué à toutes les surfaces. Il s'agit de la luminosité diffuse et donc indépendante de la direction de la scène. Le soleil est une source lumineuse dirigée, qui peut être supposée être infiniment éloignée. L'éclairage effectué par le soleil sur une surface est déterminé en formant le produit scalaire du vecteur directionnel du soleil et du vecteur normal de la surface. Si la valeur est négative, la surface est orientée vers le soleil.
Coupure


Seules les primitives qui se trouvent dans le volume visuel doivent être tramées (dessinées). Ce volume visuel est défini comme l'intérieur d'un tronc de cône , une forme en forme de pyramide avec un sommet coupé. Les primitives qui se trouvent complètement en dehors du volume visuel sont rejetées ; on parle alors de « frustum culling » . D'autres méthodes de « culling » telles que le « back-face culling », qui réduit le nombre de primitives à prendre en compte, peuvent théoriquement être exécutées à n'importe quelle étape du pipeline graphique. Les primitives qui ne se trouvent que partiellement à l'intérieur du cube doivent être découpées contre le cube. L'avantage de l'étape de projection précédente est que le découpage a toujours lieu contre le même cube. Seules les primitives, éventuellement découpées, qui se trouvent dans le volume visuel sont transmises à l'étape finale.
Transformation fenêtre-fenêtre d'affichage

Pour afficher l'image dans une zone cible (fenêtre d'affichage) de l'écran, une autre transformation, la transformation Fenêtre-Fenêtre d'affichage , doit être appliquée. Il s'agit d'un décalage, suivi d'une mise à l'échelle. Les coordonnées résultantes sont les coordonnées du périphérique de sortie. La fenêtre d'affichage contient 6 valeurs : la hauteur et la largeur de la fenêtre en pixels, le coin supérieur gauche de la fenêtre en coordonnées de fenêtre (généralement 0, 0) et les valeurs minimale et maximale de Z (généralement 0 et 1).
- Officiellement:
- Avec vp=Viewport; v=Point après projection
Sur le matériel moderne, la plupart des étapes de calcul de géométrie sont effectuées dans le vertex shader . Celui-ci est en principe librement programmable, mais effectue généralement au moins la transformation des points et le calcul de l'éclairage. Pour l'interface de programmation DirectX, l'utilisation d'un vertex shader personnalisé est nécessaire à partir de la version 10, tandis que les versions plus anciennes disposent toujours d'un shader standard.
Rastérisation
L'étape de rastérisation est l'étape finale avant le pipeline de fragment shader avec lequel toutes les primitives sont rastérisées . Dans l'étape de rastérisation, des fragments discrets sont créés à partir de primitives continues.
Dans cette étape du pipeline graphique, les points de la grille sont également appelés fragments, pour une plus grande différenciation. Chaque fragment correspond à un pixel dans le tampon d'image et celui-ci correspond à un pixel de l'écran. Ceux-ci peuvent être colorés (et éventuellement éclairés). De plus, il est nécessaire de déterminer le fragment visible, le plus proche de l'observateur, dans le cas de polygones qui se chevauchent. Un tampon Z est généralement utilisé pour cette détermination de surface dite cachée . La couleur d'un fragment dépend de l'éclairage, de la texture et d'autres propriétés matérielles de la primitive visible et est souvent interpolée à l'aide des propriétés du sommet du triangle. S'il est disponible, un fragment shader (également appelé Pixel Shader ) est exécuté à l'étape de rastering pour chaque fragment de l'objet. Si un fragment est visible, il peut désormais être mélangé avec des valeurs de couleur déjà existantes dans l'image si la transparence ou le multi-échantillonnage sont utilisés. Dans cette étape, un ou plusieurs fragments deviennent un pixel.
Pour éviter que l'utilisateur ne voie la tramage progressif des primitives, une double mise en mémoire tampon est effectuée. Le tramage est effectué dans une zone mémoire spéciale. Une fois l'image entièrement tramée, elle est copiée dans la zone visible de la mémoire d'images.
Inverse
Toutes les matrices utilisées sont non singulières et donc inversibles. Comme la multiplication de deux matrices non singulières crée une autre matrice non singulière, toute la matrice de transformation est également inversible. L'inverse est nécessaire pour recalculer les coordonnées du monde à partir des coordonnées de l'écran - par exemple pour déterminer à partir de la position du pointeur de la souris l'objet cliqué. Cependant, comme l'écran et la souris n'ont que deux dimensions, la troisième est inconnue. Par conséquent, un rayon est projeté à la position du curseur dans le monde, puis l'intersection de ce rayon avec les polygones du monde est déterminée.
Shader
Les cartes graphiques classiques sont encore relativement proches du pipeline graphique. Avec les exigences croissantes imposées au GPU , les restrictions ont été progressivement supprimées pour créer plus de flexibilité. Les cartes graphiques modernes utilisent un pipeline librement programmable et contrôlé par shader, qui permet un accès direct aux différentes étapes de traitement. Pour soulager le processeur principal, des étapes de traitement supplémentaires ont été déplacées vers le pipeline et le GPU.
Les unités de shader les plus importantes sont les vertex shaders , les geometry shaders et les pixel shaders.
Le shader unifié a été introduit pour tirer pleinement parti de toutes les unités. Cela permet d'obtenir un seul grand pool d'unités de shader. Selon les besoins, le pool est divisé en différents groupes de shaders. Une séparation stricte entre les types de shader n'est donc plus utile.
Il est également possible d'utiliser un « compute shader » pour effectuer des calculs à partir de l'affichage d'un graphique sur le GPU. L'avantage est qu'ils s'exécutent de manière très parallèle, mais il existe des limites. Ces calculs universels sont également appelés calculs à usage général sur les unités de traitement graphique , ou GPGPU en abrégé.
Les shaders de maillage sont un ajout récent, visant à surmonter les goulots d'étranglement de la disposition fixe du pipeline géométrique.