Sujet de Master 2008-2009
Voyage dans un volume procédural
Responsable
Contexte
Les textures
procédurales -ou "fonctions de bruit"- de Perlin sont
universellement utilisées en synthèse d'image: une simple fonction
continue pseudo aléatoire hiérarchique permet d'imiter les motifs
ou
les reliefs d'énormément de matériaux (bois, marbre, eau, nuages,
surfaces rugueuses...) à la volée, à partir d'une poignée de
paramètres. Au delà des textures de couleur et d'aspect de surface
(bump), elles servent
aussi à sculpter des formes, et même du mouvement (pseudo-turbulence).
En pratique, si l'on peut utiliser le bruit "pur", on s'en sert souvent
aussi pour enrichir en détails des données explicites existantes (qu'il
s'agisse de couleur, forme, mouvement).
Après son
succès en production d'effets spéciaux, son usage se répand maintenant
dans les applications temps-réel (jeux vidéos, simulateurs...), grace à
la programmabilité des GPU. En
particulier, nous l'utilisons pour engendrer à la
volée les détails de
nos volumes (nuages, avalanches, explorations biologique), notre
objectif général étant l'exploration temps-réel haute-qualité de scènes
volumiques très vastes et détaillées.
Hélas, si l'utilisation de cette famille de fonctions est
relativement intuitive, ses propriétés sont approximatives, et l'aspect
des motifs générés difficilement
contrôlables (ie, finement prévisible). De plus elles peuvent s'avérer
couteuses: évaluée aveuglément en tous les voxels d'un volume, sont
coût devient
prohibitif.
Quelques travaux
récents se sont intéressés à obtenir un meilleur
contrôle du spectre de la texture générée, ou encore à contrôler
l'orientation des
motifs, mais dans l'ensemble il y a très peu de travaux, et tout le
monde utilise encore la fonction décrite dans l'article fondateur de
1985 (voir liens dans le texte, et biblio plus bas).
Au delà du "bruit", on
s'intéresse à tout ce qui permet d'enrichir en détails et
de "tuner" à la volée l'aspect des données enrichies (voxels, couleur,
voire mouvement): typiquement, un volume basse résolution de voxels de
densités (ie, niveaux de gris) est enrichi en détails, puis "shapé" par
une fonction type sigmoide, puis converti en couleurs par des fonctions
de transfert, puis illuminé (ce qui suppose d'estimer son gradient
local). On obtient ainsi un objet de tres haute résolution apparente,
réglable et explorable dynamiquement. Mais bien des problèmes
théoriques ayant des conséquences pratiques graves sont jusqu'à
maintenant totalement ignorés (cf ci dessous).
Description
Le but de ce stage vise à étudier les propriétés puis adapter
fonctions et algorithmes de bruit procédural afin de les rendre plus
utilisables
et compatibles avec l'exploration temps-réel de volumes procéduraux
très vastes et
détaillés, et d'étendre les possibilités de ces fonctions de bruit.
Ceci comprend le bruit lui-même, mais aussi toute la chaîne de
transformations conduisant à l'image finale (i.e. amplification, et
fonctions a posteriori).
Voici les principales pistes que nous envisageons à terme. L'ensemble
dépasse
bien sûr le temps d'un stage de Master, lequel s'attachera à explorer
une partie d'entres elles.
- L'une de nos préoccupations essentielles concerne les "niveaux de
détail",
c'est à dire la simplification du motif avec la distance (i.e. filtrage):
la
méthode
de Perlin native se contente d'additionner moins de fréquences, mais
cela change
quantitativement et qualitativement le motif et peut même introduire
des discontinuités spatiales et temporelles, ce qui n'est pas
acceptable.
- Un problème dur également lié au filtrage: le bruit est rarement
utilisé pur; il est souvent composé avec des fonctions non-linéaires
qui le "reshape" (sigmoide transparent/opaque) puis le traduisent en
couleur. La méthode usuelle consistant pour
filtrer à simplement appliquer les fonctions sur le bruit filtré est
donc fausse...
et ça se
voit. Par ailleurs, cette composition change le spectre de la texture,
et donc complique la prédiction du résultat, et du
niveau de détail à appliquer à une distance donnée.
- Autre préoccupation, l'évaluation minimaliste: quand il
s'agit de générer de la forme en volume
(ex, nuages), la plupart
des zones de l'espace seront complètement pleines ou vides. Pourtant,
évaluer aveuglément la
fonction dans ces zones coûte aussi cher que dans les régions pleines
de détails: le cas le plus coûteux est paradoxalement celui d'un rayon
traversant 100%
de vide, puisqu'il faudra évaluer tous les voxels de la trajectoire !
Pour éviter cela, il faut savoir prédire ces situations,
hiérarchiser l'évaluation de la fonction (évaluation paresseuse),
voire adapter la fonction de bruit pour que ses propriétés se prêtent
mieux à cette optimisation.
- Du point de vue expressivité et fonctionalités,
l'utilisateur souhaiterait avoir plus de contrôle sur le bruit,
par exemple pour lui faire épouser un contour, ou pour permettre des
inclusions (noeuds du bois). Des travaux récents sur le bruit contraint
pour les
fluides offrent des indices à généraliser.
- De même, l'extension du bruit 2D au 3D n'est pas toujours si
aisée pour
l'utilisateur: il est parfois difficile de reproduire certains motifs
pourtant naturels en 2D: "piquants", "réseau de filaments" (type trabéculaire),
pourtant communs dans la nature et utiles aux graphistes.
Comment enrichir en ce sens bruit et fonctions a posteriori ?
- Enfin, on peut imiter un mouvement de fluide turbulent en faisant
tourner les vecteurs aléatoires
(flownoise).
Mais quel est vraiment la propriété du champs de vitesse apparent
obtenu,
comment le contrôler ? Comment faire fluctuer spatialement la vitesse
de rotation ? (interpoler naïvement des angles de rotation fini par
faire des
"noeuds").
Comme on le voit, les pistes d'améliorations sont nombreuses, qu'il
s'agisse
de faire les calculs actuels plus efficacement, de les filtrer à
meilleure qualité, ou d'étendre les fonctionnalités!
Références