Pipeline d'affichage
Jeudi, 02 Juillet 2009 01:28

Architecture globale

Le moteur gère plusieurs types d’objets graphiques, ceux-ci sont rendu par le module "Renderer". Sa fonction est de prendre en entrée une liste d’objets dont il va devoir faire le rendu en fonction des matériaux respectifs de chaque objets.

Pipeline du rendu

La boucle principale effectue donc le rendu d’une liste d’objets graphiques à chaque frame. L’objet "SceneObject" possèdes des fonctions de transformation et de rendu en fonction de son type (animé, skinné, statique...), il possède aussi un matériau qui lui est propre possédant les données graphiques (textures, couleurs, paramètres...), on peut modifier le matériau et en créer indépendamment de l’objet. A noter que c’est le matériau de l’objet qui communique avec le shader pour transmettre les données à la carte graphique.

Utilisation de matériaux

Les fichiers Effect (.fx)

Le moteur gère des fichiers Effect (issue d’une librairie de DirectX). Un fichier effect peut contenir un ou plusieurs shaders (qui correspondent à une passe de rendu), celui-ci est compilé puis exécuté par la carte graphique. Les effect sont une sur-couche des shader de base HLSL, ils ont l’avantage d’être rapide à implémenter tout en proposant une interface CPU/GPU simplifiée, cela permet de faire passer des données aux shaders de manière intuitive.

Les shaders

Un shader (qui a été chargé à partir du fichier effect) est attribué à un objet graphique, il définit donc la manière dont le rendu de l’objet va être fait par la carte graphique. L’objet se charge ensuite de transmettre le shader au matériau qui va s’occuper de transmettre toutes les données à la carte graphique.

Gestion de l’illumination dans le moteur

Types de lumières

Trois types de lumières sont gérées par le moteur, à savoir la lumière omnidirectionnelle (point light), la lumière directionnelle et la lumière de type spot. Ce sont les trois types qui sont utilisés généralement dans le jeu vidéo et la synthèse d'image. Chacune de ces trois lumières peuvent être paramétrées de façon dynamique dans le moteur (couleur, position, angle, atténuation).

Shader d’illumination

L’illumination dans le moteur est gérée grâce à un shader d’illumination qui prend en entrée une liste de lumière avec les paramètres qui leur sont liés, et calcule le modèle d’illumination de phong pour chaque pixel de l’objet (calcul effectué dans le pixel shader).

Effets graphiques

Normal mapping

Cette technique est souvent utilisée dans le jeu vidéo, pour augmenter le niveau de détail d’un objet qui présente très peu de polygones. En effet, le calcul de la lumière est dépendant des normales de chaque objet, ce sont elles qui révèlent le relief de l’objet. Plus les normales sont nombreuses, mieux on renseigne le shader sur la topologie de l’objet. Cependant le fait d’utiliser des maillages low poly (contraintes imposée par le temps réel) fait que le détail est quasi inexistant sur l’objet, d’où la nécessité d’utiliser des normal map, qui contiennent les normales de l’objet sous forme d’une texture. On peu ainsi simuler du détail sur des maillages ayant très peu de polygones.

Exemple de rendu avec normal mapping

Specular mapping

La specular map permet de définir une intensité spéculaire, qui sera utilisée par le shader pour savoir quelles parties de l’objet est brillant. C’est une valeur en niveau de gris, le blanc correspond à la brillance maximale et le noir à une surface mat. Cette valeur est gérée dans le moteur dans le canal de l’alpha de la texture diffuse de l’objet.

Shadow mapping

Cette technique est couramment utilisée en temps réel pour générer des ombres dynamiques. Son principe est de considérer la lumière comme une caméra, et de faire le rendu de la scène à partir de son point de vue. Ensuite lors du rendu de la scène, on fait la différence entre les deux rendu, cela nous révèles les zones inaccessibles par le point de vue de la lumière, et on en déduit les zones d’ombres. Des techniques d’optimisations existent pour rendre les shadow map « soft », car le rendu des ombres est directement lié à la définition de la texture (qui ne peut avoir une grande résolution à cause des contraintes temps réel).

 Rendu d’ombres en utilisant une shadow map

Post-Effect

Le moteur permet d'utiliser des post-effets, c'est à dire des effets appliqués après le rendu d'une scène. Les post-effets sont très utilisés pour apporter du réalisme ou un style particulier à un rendu. Il existe de nombreux algorithmes de post-effects essentiellement tirés des algorithmes 2D. L’architecture du moteur permet d’intégrer une suite d’effets au rendu. Parmi eux, le motion blur (flou de mouvement) a été intégré au moteur. Il a pour but de flouter les objets en fonction de leur vitesse de déplacement, cela rend le rendu plus fluide au niveau des mouvements (grâces à des arêtes moins marqués).

Rendu sans effet Rendu avec motion blur