Comprendre le rendu 3D étape par étape avec 3DMark11

Publié le 28/11/2011 par
Imprimer
Le rendu différé
Avant de rentrer dans le vif du sujet, il convient de décrire le type de rendu observé. 3DMark 11 et de plus en plus de jeux à l'aspect graphique évolué, font appel au rendu différé, Battlefield 3 en étant probablement l'évolution la plus avancée. Un rendu classique, ou rendu direct, consiste à calculer l'éclairage triangle par triangle, au fur et à mesure que les objets sont traités. Etant donné que certains triangles ou des morceaux de ceux-ci vont finalement être masqués par d'autres, l'éclairage est calculé inutilement pour de nombreux pixels. Un gaspillage de puissance de calcul qui peut être très important.

Le rendu différé s'attaque à ce problème. Pour cela, seules des composantes basiques (ce qui inclut les textures), nécessaires à l'éclairage, sont calculées dans un premier temps, lors du passage en revue de tous les objets de la scène. Toutes ces données sont stockées dans des mémoires tampons temporaires appelées Render Targets (RT) (dont l'ensemble se nomme g-buffer) et combinées ultérieurement pour le calcul final de l'éclairage, qui peut alors être vu comme un filtre de post-traitement et ne sera effectué qu'une seule fois par pixel affiché à l'écran. Une partie de la puissance de calcul nécessaire est ainsi économisée et il est plus simple de gérer des éclairages complexes avec de nombreuses sources de lumière.


En contrepartie, la consommation mémoire peut augmenter et la bande passante nécessaire au stockage de toutes les données intermédiaires peut engorger le GPU lors des premières étapes de rendu. Les désavantages incluent également une difficulté pour gérer l'antialiasing de type multi-sample et les surfaces transparentes. Futuremark a mis en place une solution pour la première mais a décidé de se simplifier la vie en ignorant la seconde : vous ne trouverez ainsi pas de pare-brise sur le 4x4 aperçu dans certaines scènes.

Nos observations
Pour expliquer le fonctionnement du rendu 3D, nous avons opté pour la scène 3 proposée par 3DMark 11, en mode Extreme, soit en 1920x1080 avec antialiasing 4x. Une scène qui a l'avantage d'être moins sombre que les autres.

Nous avons segmenté le rendu en étapes qui correspondent grossièrement aux passes qui structurent un rendu 3D. Si les GPUs modernes sont capables de faire énormément de choses en une seule passe, soit avant d'écrire un résultat en mémoire, il est plus simple, plus efficace et parfois obligatoire d'avoir recours à plusieurs passes de rendu. Il s'agit d'ailleurs d'un aspect fondamental lié au rendu différé et aux effets de post processing.

Pour chaque étape nous avons extrait des visuels qui la représentent aussi clairement que possible. Etant donné que certains Render Targets sont au format HDR, non-directement affichable, nous avons dû les modifier légèrement pour qu'ils soient plus représentatifs.

Enfin, pour les amateurs de détails, nous avons ajouté des explications plus techniques ainsi qu'un certain nombre d'informations liées à chaque passe, chiffres que nous avons obtenus dans GPU Perf Studio :

Temps de rendu :le temps (en ms) mis par le GPU de la Radeon HD 6970 pour traiter la totalité de la passe, avec une petite surévaluation liée aux outils de mesures (+ % du temps total pour le rendu de l'image).

Vertices avant tessellation : nombre de vertices qui rentrent dans le GPU, ce qui exclu les triangles générés par la tessellation.

Vertices après tessellation : nombre de vertices qui sortent de la tessellation, ce qui inclus les triangles générés par la tessellation.

Primitives : nombre de primitives (triangles, lignes ou points) qui rentrent dans le setup engine.

Primitives éjectées du rendu : nombre de primitives éjectées du rendu par le setup engine, soit parce qu'elles tournent le dos à la caméra et ne sont donc pas visible (face cachée des objets), soit parce qu'elles sont hors du champ de vision.

Pixels : nombre de pixels générés par le rasterizer (2.1 millions de pixel pour une surface de 1920x1080).

Eléments exportés par les PS : nombre d'éléments écrits en mémoire par les pixels shaders, il peut y en avoir plusieurs par pixel généré par le rasterizer, c'est le cas lors de la construction du g-buffer.

Texels : nombre de texels (éléments de texture) lus par les unités de texturing, plus le filtrage est complexe, plus il y en a.

Instructions exécutées : nombre d'instructions exécutées par une Radeon HD 6970 pour le traitement de l'ensemble des shaders, quels qu'ils soient.

Quantité de données lues : quantité totale des données lues à partir des textures et des RTs en cas de mélange (à l'exception des données de profondeur et géométriques).

Quantité de données écrites : quantité totale des données écrites dans les RTs (à l'exception des données de profondeur)

Notez que ces quantités de données sont différentes de celles qui transitent vers la mémoire vidéo puisque les GPUs intègrent de nombreuses optimisations qui s'attachent à réduire leur volume.
Vos réactions

Top articles