Navigation

Tutoriel précédent : les cartes accélératrices 2D   Sommaire   Tutoriel suivant : pilotage par le logiciel

II. Introduction

Le premier jeu à utiliser de la vraie 3D fut le jeu Quake, premier du nom. Et depuis sa sortie, presque tous les jeux vidéos un tant soit peu crédibles utilisent de la 3D. Face à la prolifération de ces jeux vidéos en 3D, les fabricants de cartes graphiques se sont adaptés et ont inventé des cartes graphiques accélératrices 3D. Ces cartes sont capables d'accélérer les calculs effectués pour afficher une scène en 3D.

III. Pipeline graphique

Depuis un bon moment, les jeux vidéos utilisent une technique de rendu spécifique : la rasterisation. Celle-ci consiste à calculer une scène 3D intégralement, avant de faire des transformations pour n'afficher que ce qu'il faut à l'écran. Notre scène 3D est composée d'un espace en trois dimensions, dans laquelle le moteur physique du jeu vidéo va placer des objets et les faire bouger.

Cette scène peut être vue en première approche comme étant un simple parallélogramme. Un des coins de ce parallélogramme sert de système de coordonnées : il est à la position (0, 0, 0), et les axes partent de ce point en suivant les arêtes. Les objets seront placés à une coordonnée bien précise dans ce parallélogramme.

Ces objets sont composés de formes géométriques, combinées les unes aux autres pour former des objets complexes. Ces formes géométriques peuvent être des triangles, des carrés, ou des formes plus compliquées. Dans certains cas, les objets sont directement représentés en utilisant ce qu'on appelle des courbes de Bézier. Dans la majorité des jeux vidéos actuels, nos objets sont modélisés par un assemblage de triangles collés les uns aux autres.

Robot en fil de fer

Ces formes, ces triangles, sont définis par des sommets. Pour faire simple, il s'agit seulement de points, auxquels on donne des coordonnées dans l'espace : abscisse, ordonnée, profondeur. Chacun de ces sommets peut aussi se voir attribuer des informations supplémentaires pour faciliter le rendu de la scène.

Ces objets sont des objets géométriques, avec une gestion minimale de l'éclairage. Pour rajouter de la couleur, ces objets sont recouverts par des textures. Ces textures sont de simples images, qui servent de papier peint à un objet. Cet objet géométrique sera recouvert par une ou plusieurs textures, qui permettront de le colorier ou de lui appliquer du relief. Ces textures font en sorte que la surface de l'objet ressemble à quelque chose.

Dans notre scène 3D, on trouve un objet spécial : la caméra, qui représente les yeux de notre joueur. Cette caméra est définie par :

  • une position ;
  • la direction du regard (un vecteur) ;
  • le champ de vision (un angle) ;
  • un plan qui représente l'écran du joueur ;
  • et un plan au-delà duquel on ne voit plus les objets.

Le but de la rasterisation, c'est de déduire ce que verra la caméra à partir de la représentation 3D de la scène.

Le calcul de l'image finale passe par diverses étapes bien séparées. Dans le cas le plus simple, on peut considérer qu'il existe quelques grandes étapes :

  • une étape de traitement des sommets ;
  • une étape de rasterisation, qui va déterminer quelle partie de l'image 3D s'affiche à l'écran, et qui attribue chaque sommet à un pixel donné de l'écran.
  • une étape d'application des textures et de traitement des pixels.

Chacune de ces étapes est elle-même découpée en plusieurs sous-étapes. Toutes ces sous-étapes doivent s'exécuter dans un ordre bien précis. L'ensemble de ces étapes et sous-étapes forme ce qu'on appelle le pipeline graphique.

III-A. Traitement des sommets

La première étape de traitement de la géométrie consiste à placer les objets au bon endroit dans la scène 3D. Lorsqu'un objet est décrit par ses sommets, les points de sa surface, ces sommets, le sont à partir d'un référentiel tout simple. Tout se passe comme si l'objet était encastré dans un cube, le plus petit possible, pouvant contenir l'objet. Un des sommets du cube possède la coordonnée (0, 0, 0), et les sommets de l'objet sont définis à partir de celui-ci.

Pour placer l'objet dans la scène, il faut tenir compte des coordonnées de sa place dans la scène, calculées par le moteur physique. Si le moteur physique a décrété que l'objet était placé à l'endroit de coordonnées (50, 250, 500), toutes les coordonnées des sommets de l'objet doivent être modifiées. Pendant cette étape, l'objet peut subir une translation, une rotation, ou un gonflement/dégonflement (on peut augmenter ou diminuer sa taille). C'est la première étape de calcul : l'étape de transformation.

Ensuite, les différents sommets de l'objet sont éclairés. C'est la phase d'illumination. Cette étape va modifier la couleur de nos sommets. Chaque sommet se voit attribuer une couleur, qui définit son niveau de luminosité : est-ce que le sommet est fortement éclairé ou est-il dans l'ombre ?

Vient ensuite une phase de traitement de la géométrie. Dans cette phase, les sommets sont assemblés en triangles, points, ou lignes, voire en polygones. Ces formes géométriques de base sont ensuite traitées telles quelles par la carte graphique.

Sur les cartes graphiques récentes, cette étape peut être gérée par le programmeur : il peut programmer les divers traitements à effectuer lui-même.

III-B. Rasterisation

Vient ensuite la traduction de ces formes (triangles) rendues dans une scène 3D en un affichage à l'écran. Cette étape de rasterisation va projeter l'image visible sur notre caméra. Et cela nécessite de faire quelques calculs.

Tout d'abord, la scène 3D va devoir passer par une phase de clipping : les triangles qui ne sont pas visibles depuis la caméra sont oubliés. Ensuite, elle passe par une phase de culling : les triangles qui, du point de vue de la caméra, sont situés derrière une surface géométrique sont oubliés. Ceux-ci ne sont simplement pas visibles depuis la caméra, donc autant les virer.

Enfin, chaque pixel de l'écran se voit attribuer un ou plusieurs triangles. Cela signifie que sur le pixel en question, c'est le triangle attribué au pixel qui s'affichera. C'est lors de cette phase que la perspective est gérée en fonction de la position de la caméra.

III-C. Pixels et textures

À la suite de cela, les textures sont appliquées sur la géométrie. La carte graphique sait à quel triangle correspond chaque pixel et peut donc colorier le pixel en question en fonction de la couleur de la texture appliquée sur la géométrie. C'est la phase d'application des textures. Sur les cartes graphiques récentes, cette étape peut être gérée par le programmeur : il peut programmer les divers traitements à effectuer lui-même.

III-D. Render Output Processing

En plus de cela, les pixels de l'écran peuvent subir des traitements divers et variés avant d'être enregistrés et affichés à l'écran. Un effet de brouillard peut être ajouté, des tests de visibilités sont effectués, l'antialiasing est ajouté, etc.

III-E. Bilan

Dans certains cas, des traitements supplémentaires sont ajoutés. Par exemple, les cartes graphiques modernes supportent une étape en plus, qui permet de rajouter de la géométrie : l'étape de tessellation. Cela permet de déformer les objets ou d'augmenter leur réalisme.

Pipeline et shaders

IV. Architecture d'une carte 3D

Avant l'invention des cartes graphiques, toutes ces étapes étaient réalisées par le processeur : il calculait l'image à afficher, et l'envoyait à une carte d'affichage 2D. Les toutes premières cartes graphiques contenaient des circuits pour accélérer une partie des étapes vues au-dessus. Au fil du temps, de nombreux circuits furent ajoutés, afin de déporter un maximum de calculs du CPU vers la carte graphique.

IV-A. Architecture de base

Néanmoins, toute carte graphique contient obligatoirement certains circuits. Ces circuits ne font pas vraiment de traitement graphique. Ils regroupent :

  • la mémoire vidéo ;
  • les circuits de communication avec le bus ;
  • le tampon de commandes.
Architecture de base d'une carte 3D

Notre carte graphique communique avec notre ordinateur via un bus. Ce bus n'est rien de plus qu'un vulgaire tas de fils qui connectent notre carte graphique à notre carte mère. Les premières cartes graphiques utilisaient un bus nommé ISA, qui servait pour toutes les cartes d'extension. Celui-ci fut rapidement remplacé par le bus PCI, plus rapide. Vint ensuite le bus AGP, puis le bus PCI-Express.

Ce bus est connecté à notre carte graphique par un contrôleur de bus. Ce circuit se charge d'envoyer ou de réceptionner les données sur le bus. Il contient quelques registres dans lesquels le processeur pourra écrire ou lire, afin de communiquer avec le contrôleur, pour lui envoyer des ordres du style : j'envoie une donnée, transmission terminée, je ne suis pas prêt à recevoir les données que tu veux m'envoyer, etc.

Tous les traitements que notre carte graphique va devoir effectuer sont envoyés par le pilote de la carte graphique. Ce pilote est un programme qui va permettre à nos jeux vidéo d'envoyer des commandes à notre carte graphique. Ces commandes sont des ordres, que notre carte graphique va devoir exécuter. Elles sont stockées temporairement dans une zone de mémoire : le tampon de commandes, avant d'être envoyées à notre carte graphique via le bus.

Ces commandes sont interprétées par un circuit spécialisé : le processeur de commandes. Celui-ci sera chargé de piloter les différents circuits présents dans notre carte graphique.

Pour effectuer ses calculs, notre carte graphique a besoin d'une mémoire RAM : la mémoire vidéo. Dans le cas le plus simple, cette mémoire sert simplement de tampon d'image : elle stocke l'image à afficher à l'écran. Au fil du temps, elle s'est vu ajouter d'autres fonctions : stocker les textures et les sommets de l'image à calculer, ainsi que divers résultats temporaires.

Cette mémoire RAM, ou mémoire vidéo, est très proche des mémoires RAM qu'on trouve sous forme de barrettes dans nos PC. Il y a toutefois quelques différences : la mémoire vidéo peut supporter un grand nombre d'accès mémoire simultanés. De plus, elle est optimisée pour accéder à des données proches en mémoire.

Il faut noter une chose : cette mémoire vidéo est partiellement accessible directement par le processeur. Elle est positionnée à des adresses bien précises, déterminées par le pilote de la carte 3D, et par l'architecture de la machine. Le processeur peut ainsi lire ou écrire directement en mémoire vidéo. On dit que cette mémoire est mappée en mémoire.

Il arrive que notre carte graphique doive aller chercher des données qui ne sont pas dans sa mémoire vidéo. Les anciennes cartes graphiques pouvaient lire ou écrire directement dans la mémoire RAM, grâce à certaines fonctionnalités du bus AGP. Cette technique a aussi été adaptée sur certaines cartes graphiques PCI-Express à faible coût. Mais dans tous les autres cas, ces données sont copiées depuis la mémoire RAM principale de l'ordinateur, vers la mémoire vidéo, en passant par le bus.

Cette copie est effectuée par un circuit spécialisé, qui est capable de copier des blocs de mémoire d'une mémoire vers un périphérique ou une autre mémoire. Ce circuit s'appelle le contrôleur DMA. Ce circuit permet ainsi d'échanger des données entre mémoire vidéo et mémoire RAM sans devoir utiliser le processeur. Il est souvent intégré dans le contrôleur de bus.

IV-B. Première génération

Les toutes premières cartes graphiques contenaient simplement des circuits pour gérer les textures, ainsi qu'un tampon d'image dans lequel l'image était stockée avant d'être envoyée à l'écran. Seules deux des étapes vues au-dessus étaient effectuées en hardware : l'étape d'application des textures, et l'étape d'enregistrement des pixels en mémoire.

On trouvait aussi un circuit pour enregistrer le résultat en mémoire et ajouter quelques effets comme du brouillard. Les calculs concernant la géométrie, ainsi que le passage d'une scène 3D à un écran 2D étaient alors réalisés intégralement par le processeur.

Architecture de cartes 3D, première génération

Par la suite, ces cartes s'améliorèrent en ajoutant plusieurs circuits de gestion des textures. Cela leur permettait de colorier plusieurs pixels à la fois. Cela permettait aussi d'utiliser plusieurs textures pour colorier un seul pixel : c'est ce qu'on appelle du multitexturing.

Architecture d'une carte 3D, première génération, seconde version

Les cartes graphiques construites sur cette architecture sont très anciennes. On parle des cartes graphiques ATI rage, 3DFX Voodoo, Nvidia TNT, etc. Les cartes suivantes ajoutèrent une gestion des étapes de rasterisation directement en matériel. Les cartes ATI rage 2, les Invention de chez Rendition, et d'autres cartes graphiques supportaient ces étapes en hardware.

De nos jours, ce genre d'architecture est rare. Toutefois, certaines cartes graphiques intégrées dans les processeurs ou les cartes mères utilisent parfois ce genre d'architecture. La différence, c'est que ces cartes graphiques disposent en plus de circuits pour traiter des pixels, capables d'effectuer des traitements spécifiques, autres qu'un simple placage de texture.

IV-C. Deuxième génération

La première carte graphique capable de gérer les étapes de traitement de la géométrie fut la Geforce 256 : la toute première Geforce. L'intérieur de la Geforce 256, ainsi que des cartes graphiques suivantes, ressemble fortement à ce pipeline. Chaque carte graphique dispose d'un circuit spécialisé pour chacune de ces étapes. Les données circulent d'un circuit à l'autre dans un ordre bien précis. Cela permet d'enchaîner les sous-étapes de traitement du pipeline graphique dans l'ordre voulu. Elle dispose donc :

  • d'un circuit pour manipuler les sommets et la géométrie ;
  • d'un circuit pour appliquer des textures ;
  • d'un circuit pour effectuer la rasterisation, le clipping et le culling ;
  • d'un circuit pour les opérations finales, comme le brouillard, la gestion de la transparence, de la profondeur, etc.

Nous verrons ces circuits en détail dans la suite du tutoriel. Mais il y a d'autres circuits en plus. Dans les grandes lignes, une carte graphique ressemble à ceci :

Architecture d'une carte 3D, deuxième génération

Pour plus d'efficacité, ces cartes graphiques possédaient parfois plusieurs unités de traitement des sommets et des pixels. Même chose pour les circuits ROP, chargés de l'enregistrement de l'image finale en mémoire.

IV-D. Troisième génération

Enfin, les cartes graphiques récentes sont devenues partiellement programmables. Dorénavant, les circuits qui gèrent les calculs sur les pixels et sur les sommets sont devenus programmables. Ce sont de simples processeurs, qui peuvent effectuer des instructions, qui possèdent des registres, et tout ce qui s'ensuit. Durant un temps, les processeurs étaient spécialisés : certains s'occupaient des calculs sur les sommets, et d'autres des calculs sur les pixels.

Au tout début, seuls les traitements sur les sommets étaient programmables. C'était le cas sur les NVIDIA's GeForce 3, GeForce4 Ti, Microsoft's Xbox, et les ATI's Radeon 8500. Puis, les cartes suivantes ont permis de programmer les traitements sur les pixels.

Architecture d'une carte 3D, troisième génération

Sur les cartes graphiques récentes, les processeurs peuvent traiter indifféremment pixels et sommets.

Architecture d'une carte 3D, troisième génération, seconde version

Pour l'avenir, on suppose que certains autres circuits deviendront programmables. Les circuits chargés de la rasterisation, ainsi que les ROP sont de bons candidats. Par contre, les circuits de textures ne changeront pas avant un moment.

Navigation

Tutoriel précédent : les cartes accélératrices 2D   Sommaire   Tutoriel suivant : pilotage par le logiciel