Se connecter avec
S'enregistrer | Connectez-vous

Tesselation

OpenGL 3 et DirectX 11 : la guerre des API 3D n’aura pas lieu
Par

La grosse nouveauté de Direct3D 10 concernait l’apparition des Geometry Shader qui permettait enfin de créer ou de détruire des sommets sur le GPU, mais le rôle de cette unité a été quelque peu mal interprété. Loin d’être utile à une expansion massive de géométrie, son rôle est plus utile pour implémenter des Point Sprites plus flexibles, gérer du Fur Shading ou calculer la silhouette d’un objet pour l’algorithme des volumes d’ombre. Pour réaliser de la tesselation rien ne vaut une unité dédiée. Initialement prévue pour Direct3D 10 (ce qui explique sa présence dans les Radeon HD) il semble que Microsoft, ATI et NVIDIA n’ait pas pu se mettre d’accord à temps et elle a donc disparue des spécifications… pour revenir en force avec Direct3D 11 ! La tesselation est donc la grosse nouveauté de Direct3D 11, tout du moins la plus facile à vendre pour des non spécialistes.

Microsoft introduit donc trois nouveaux stages à son pipeline de rendu :

Contrairement aux autres étapes du pipeline ceux-ci ne fonctionnent pas avec des triangles comme primitives mais en utilisant des patchs. Le Hull shader prend donc en entrée les points de contrôle d’un patch, détermine certains paramètres du Tesselator qui est une unité fixe, comme par exemple le TessFactor qui indique la finesse de la tesselation. Le Tesselator est une unité fixe par conséquent le programmeur ne contrôle pas comment est opéré la tesselation, celui-ci renvoie les points générés au domain shader qui peut appliquer des opérations sur ces derniers. Un exemple devrait permettre d’éclaircir tout ça, prenons le cas qui ressort à chaque génération depuis la Parhelia du Displacement Mapping :

En entrée du vertex shader on trouve donc les points de contrôle du patch. Le programmeur peut les animer comme il le souhaite, ceux-ci sont peut nombreux : il s’agit pour simplifier d’une version très grossière du mesh final. Ces points transformés sont ensuite passés au Hull shader qui détermine combien de fois subdiviser chaque côté du patch (par exemple en fonction de la taille du patch en pixels à l’écran). Le Tesselator se charge de la tesselation à proprement parler c’est-à-dire de la création de la géométrie, celle-ci est passée au domain shader. Ce dernier transforme les points générés dans l’espace adéquat (les points sortant du Tesselator étant dans l’espace du patch) produisant ainsi des sommets classiques qu’il peut déplacer en fonction d’une texture pour obtenir du Displacement Mapping.

Les possibilités sont énormes, grâce à la tesselation il devient possible de se passer des normal map et d’implémenter un niveau de détail directement sur le GPU permettant d’utiliser des modèles très détaillés (plusieurs millions de polygones au lieu de la dizaine de milliers des jeux actuels). Tout du moins en théorie, en pratique la tesselation pose un certain nombre de problème qui ont jusqu’ici empêché l’essor de cette technique. Direct3D 11 et les cartes compatibles pourront-ils éviter ces écueils et proposer une version fonctionnelle ? Il est trop tôt pour le dire mais en tout cas tout le monde n’est pas convaincu et Id Software travaille à résoudre le même problème de la géométrie avec une approche complètement différente à base de raycasting de voxels.