Application temps réel et pipeline graphique

 

 

1 Pipeline graphique

 

Une application 3D se décompose de la façon suivante

  • Application (CPU)
  • Géométrie (GPU)
  • Transformation (GPU)
  • Rasterization (GPU)

L’application s’exécute au niveau du processeur de l’ordinateur (CPU). Pour ce qui est de la 3D, l’application met à jour les positions, rotation et le scale des modèles 3D.

La géométrie est chargée par l’application dans la mémoire d’une carte dédiée 3D, le GPU.

La carte GPU se chargera des calculs(transformation) et du rendu (rasterization)

Le processus de transformation des géométries et du rendu s’appelle le pipeline graphique.

Des interfaces de programmation existent pour accéder au pipeline.

Les plus connus sont OpenGL et DirectX et récemment Vulcan.

DirectX est une solution propriétaire des plateformes Microsoft Windows.

Vulcan est la ‘suite’ de OpenGL. Vulcan a été conçu dans une optique de performances multi-plate-formes.

 

1.1  Application

 

L’application est le programme qui permet de charger et de piloter l’environnement 3D.

La partie applicative s’occupe entre autres de :

  • Chargement des modèles 3D
  • Entrée utilisateurs
  • Animation des modèles
  • Gestion des collisions

Une fois la position des modèles 3D mis à jour, l’application fait appel au pipeline graphique afin de calculer et d’afficher la scène.

1.2  Géométrie

 

Position,Rotation,Scale

La position est un vecteur 3D, représenté par 3 nombres réels x,y,z. Il représente un point dans un référentiel 3D.

La rotation est un vecteur 3D

Vertex

Un Vertex est un point 3D représenté par des coordonnées x,y,z.

Face

Une face est une liste d’index vers 3 vertices représentant une surface (triangle)

En règle générale les moteurs 3d temps réel ne gèrent que des triangles.

Les faces de quatre côtés appelés quad sont générées à partir de 2 triangles.

Strips

Le vertex strip est un assemblage de triangles connectés partageant les vertices.

Les vertices se suivant les uns à la suite des autres, dans ce cas il n’est pas besoin d’avoir une liste de faces, ce qui économise de l’espace mémoire. Les strips sont une organisation de données souvent utilisée pour les maillages générés à partir de primitives mathématiques telles que les objets CAD. Le format 3DXML les utilisent beaucoup par exemple.

Normal

Vecteur 3d (x,y,z) associé à un vertex. Elle est utile au calcul de la lumière. Un triangle contient 3 normales.

Texture

Une texture est une image avec des attributs de tiling. Elle est référencée par un matériel qui sera appliqué au faces.

Coordonnés de mapping.

Coordonnées 2D dans le référentiel de la texture associées au point 3D.

Index Buffer

Un index buffer est une liste d’indices pointant vers des vertices et représentant une liste de triangles. La taille de l’index buffer est toujours un multiple de 3.

Material

Un matériel définit la manière dont sera rendu une surface en fonction de ses paramètres et de l’environnement (lumière)

Les paramètres varient suivant le type de matériel.

Les plus communs sont :

  • Diffuse : Couleur.
  • Specular : réflexion lumineuse.
  • Emission : lumière émise par l’objet.
  • Ambiant : réaction à la lumière ambiante.
  • Texture : image qui sera appliquée sur la surface.

Mesh

Un mesh est un maillage qui consiste en une liste de vertices (Vertex Buffer), une liste d’index vers ces vertices (Index Buffer) qui représente les faces, et un matériel qui sera appliqué à ces faces.

Light

En 3d temps réel il existe trois type de lumières.

Ces 3 types de lumières sont utilisées car rapides à calculer.

Point : un point qui éclaire dans toute les directions jusqu’à une certaine distance.

Spot : défini par une position dans l’espace, une rotation et un angle d’ouverture de cône.

Directional :

Définie par une rotation et un effet infini. Elle est utilisée pour simuler la lumière ambiante en intérieur ou le soleil en extérieur.

Elle possède un paramètre de couleur qui sera utilisé lors du rendu en fonction du matériel appliqué au maillage.

Caméra

Une caméra est un référentiel dans l’espace qui servira de point de vue pour le rendu de la scène.

Une caméra est définie par un near plan qui représente la surface de rendu, un far plan au-delà duquel la scène ne sera plus rendu et un type de projection.

Il existe deux types de projections.

  • La projection orthographique qui est une projection parallèle (sans perspective). La zone qui sera rendue est incluse dans un parallélépipède.
  • La projection en perspective est définie par une longueur de focal. La zone de rendu est une pyramide tronquée (frustum) par le near plan.

Octarina_Pipeline

Entité

Une entité est un référentiel 3D (position, rotation, scale) qui est associé à un mesh, une caméra ou une light afin de la positionner dans l’espace.

Scène

Une scène est une hiérarchie contenant les entités nécessaires à la représentation du monde 3D.

2 Pipeline de Rendu

1.2 Transformation

Afin d’effectuer rapidement les transformations de référentiel des modèles dans l’espace 3D les moteurs de rendu utilisent des matrices.

Ces matrices sont formées à partir des attributs de positionnement des modèles dans l’espace : position, rotation et scale.

Le moteur de rendu parcourt la hiérarchie des entités de la scène et multiplie récursivement les matrices de chacune par leur parent afin de créer la matrice de transformation de l’entité (et de son maillage associé) : mModel.

Chaque matrice mModel sera multipliée par la matrice camera mCamera et la matrice de projection mProj, pour produire la matrice mModelCameraProjection.

La carte 3D multipliera en parallèle chaque vertex du maillage par cette matrice afin de calculer la position du vertex du maillage sur l’écran.

Détail : http://www.codinglabs.net/article_world_view_projection_matrix.aspx

Les GPU possèdent des unités algorithmiques appeler geometry shader capableS d’effectuer des milliers de multiplications en parallèle.

1.2 Rasterisation

La rastérisation est le processus de tracé de l’aire du triangle sur l’écran.

Le CPU fait appel à un shader (fragment shader) pour chaque pixel du triangle.

Le shader utilisera en entrée les attributs du matériel, la liste des lumières afin de calculer la couleur du point à tracer sur l’écran. Il se chargera aussi de calculer la distance entre la caméra et le point tracé afin de ne tracer que les points les plus proches et ainsi éviter les recouvrements.

Taille des géométries

  • En mémoire

Un vertex contient 3 nombres réels (x,y,z) (float).

Un float a une taille de 32 bits, soit 4 octets.

Un vertex contient donc 4×3=12 octets

Les normales font la même taille que les vertex (x,y,z)

Les index de faces sont en général stockés sur 16 bits (2 octets), permettant d’indexer un maillage de 65536 vertices. Une face faisant 3 index vers 3 vertices cela fait 6 octets pour une face.

Par souci d’économie de mémoire (et parfois contrainte des cartes 3d sur mobile) un maillage contenant plus de 65536 vertices est scindé en plusieurs maillage.

La taille d’un modèle en mémoire se calcule ainsi :

Nombre de vertex * 12 octets + Nombre de normal * 12 octets + nombre de faces * 6 octets.

Ainsi pour un maillage d’un million de vertices/normales et de 700,000 faces

1,000,000*12*2 + 700,000*3*2 = 28,200,000 octets

  • Sur le disque dur

Ce maillage peut être compressé sur disque a environ 40% soit 11,2Mo