Accueil » Dossier » Rendu 3D : le raycasting de voxels » Page 5

Rendu 3D : le raycasting de voxels

1 : Introduction 2 : Un peu d’histoire… 3 : Un peu de technique (voxel)... 4 : Un peu de technique (octree, raycasting)... 6 : Les avantages du Sparse Voxel Octree (suite) 7 : Les limites 8 : Conclusion

Les avantages du Sparse Voxel Octree

Intéressons nous maintenant aux avantages de notre octree de voxels dans le domaine du rendu. Le principal intérêt de cette structure de donnée est qu’elle permet de résoudre de façon élégante le problème de niveaux de détails des textures mais aussi de la géométrie le tout avec un seul algorithme ! En effet comme nous l’avons sous entendu dans le paragraphe précédent chaque nœud de l’octree contient une information de couleur, on peut par conséquent se débarrasser des textures 2D que nous connaissons, ou plus précisément, l’octree est à la fois la texture ainsi que la géométrie.

Image 1 : Rendu 3D : le raycasting de voxelsPar conséquent le problème de niveaux de détails (LoD) qui auparavant devait être géré pour la géométrie et pour les textures de façon totalement indépendantes se résume à un seul système désormais : gérer le niveau de détail de l’octree et il s’avère que cela peut se faire très simplement. Le principe est en quelque sorte une extension du mipmapping que l’on emploie pour les textures. L’objectif du mipmapping est d’essayer de conserver des texels (les éléments de la texture) d’une taille la plus proche possible d’un pixel. Pour cela plusieurs résolutions de la texture sont précalculées et stockées et le hardware adapte le choix du niveau de mipmap en fonction de la taille de la texture à l’écran.

Il est possible de faire quelque chose de similaire avec les octrees de voxel, le choix du niveau de détails se fait dynamiquement : dès que la taille d’un voxel est inférieure à la taille d’un pixel on arrête la traversée du rayon dans l’octree à ce niveau là. Il suffit donc dans chaque nœud de stocker la moyenne des informations contenues dans ses fils pour obtenir une gestion des niveaux de détails de manière très simple. Ce mécanisme est parfaitement adapté à un système de streaming, un peu à l’image de ce qu’emploie déjà id Software pour les MegaTexture : seules les portions de l’octree qui sont nécessaires sont stockées en mémoire vidéo, une autre partie réside en mémoire centrale pour accélérer les accès suivants mais surtout la grosse majorité de l’octree reste tout simplement sur le support de stockage.

La conséquence est qu’on dispose en effet d’une quantité de géométrie (et de textures comme nous l’avons vu) quasiment illimitée : l’octree peut être aussi détaillé qu’on veut, à l’exécution la quantité de mémoire et le temps d’affichage resteront (relativement) constants. La seule limite ici concerne donc le temps que les artistes pourront consacrer à la création de cet octree et les limites physiques des supports de stockage des machines de prochaine génération.

Soyons clairs : il est possible de résoudre ce problème de différentes manières, les systèmes de textures virtuelles (MegaTexture ou Sparse Virtual Textures) ont déjà résolu le problème pour les textures et seront intégrées aux principaux moteurs 3D l’an prochain (CryEngine 3, idTech 5…). Le cas de la géométrie est plus compliqué à résoudre mais il existe plusieurs pistes pour résoudre ce problème. La solution la plus simple consiste à précalculer plusieurs versions d’un mesh à des résolutions différentes et de sélectionner la plus adaptée en fonction de la distance du mesh à la caméra. Cette solution basique est simple à mettre en œuvre mais les artefacts visuels qui surviennent en passant d’un niveau de détails à un autre sont importants.

Image 2 : Rendu 3D : le raycasting de voxels

Sommaire :

  1. Introduction
  2. Un peu d’histoire…
  3. Un peu de technique (voxel)...
  4. Un peu de technique (octree, raycasting)...
  5. Les avantages du Sparse Voxel Octree
  6. Les avantages du Sparse Voxel Octree (suite)
  7. Les limites
  8. Conclusion