# Rendu volumique direct

Le rendu volumique direct est une technique utilisée pour afficher une projection 2D d'une série de données 3D.

## Rendu volumique direct

Le rendu volumique direct nécessite que chaque valeur échantillonnée au sein du volume soit associée à une opacité et une couleur.
Mathématiquement, cela revient à dire qu'on dispose d'une fonction de transfert $f$ :
${\begin{array}{rccl}f:&{\mathcal {V}}&\to &{\mathcal {C}}\times [0,1]\\&\mathbf {x} &\mapsto &(c,\alpha )\end{array}}$
où ${\mathcal {V}}\subset \mathbb {R} ^{3}$ est la région de l'espace où la fonction est définie, et ${\mathcal {C}}$ est l'espace de couleurs utilisé (par exemple ${[0,1]}^{3}$ ou ${[\![0,255]\!]}^{3}$si les couleurs sont définies par leurs valeurs RGB).
La fonction de transfert est généralement modélisée par une fonction affine par morceaux. Cela revient à dire qu'elle est définie sur une partie finie de ${\mathcal {V}}$ (par exemple une grille 3D régulière) et que le reste de ses valeurs s'en déduit par interpolation trilinéaire. D'autres formes sont néanmoins possibles (fonctions en escalier, etc.).
Les valeurs d'opacité et de couleur sont converties en composantes RGBa (canaux rouge, vert et bleu pour la couleur, et canal alpha pour l'opacité) et le composé résultant est projeté sur le pixel correspondant du Z-buffer. La détail du procédé fait l'objet de différentes techniques de rendu, qui peuvent être combinées afin de tirer parti de leurs différents avantages.

## Le lancer de rayons

Le moyen le plus commun de projeter une image 3D est le lancer de rayons à travers le volume. Cette technique consiste à reproduire le trajet inverse de la lumière pour chaque pixel de l'image finale : on "lance" un rayon depuis la caméra (par exemple depuis le centre optique si on se place dans le cadre du modèle du sténopé) en respectant les lois de la réflexion et de la réfraction, jusqu'à atteindre une source lumineuse. Généralement, le rayon est échantillonné à pas régulier à l'intérieur du volume, et les valeurs de couleur rencontrés sont sommées dans le Z-buffer au prorata de leur opacité alpha.
Ce type d'algorithme est aisément parallélisable sur des architectures SIMD.

## Splatting

Cette technique compromet la qualité de rendu du lancer de rayon pour y gagner en rapidité de traitement : chaque sous-élément volumique du volume à rendre est projeté directement dans le plan écran en utilisant une représentation 2D appropriée à ces sous-éléments (généralement ellipsoïde) dont les propriétés de couleur et de transparence varient doucement du centre vers l'extérieur de la projection.
Selon l'application, des représentations 2D aux propriétés uniformes sont aussi utilisées.

## Shear warp

C'est une nouvelle approche de rendu volumique développé par Philippe Lacroute et Marc Levoy. Dans cette technique, le volume est transformé de telle sorte que les rayons émis soient alignés sur l'axe de la normale de la face du volume la plus proche du point de vue. Chaque tranche du volume subit donc une translation et une mise à l'échelle.
Ainsi les tranches du volume (textures 2D) sont accumulées successivement de la plus proche à la plus éloignée en respectant la contribution de chaque échantillonnage au pixel final. Cette image intermédiaire est ensuite transformée pour respecter les déformations liées à la perspective du point de vue.
Cette technique est relativement rapide au prix d'un échantillonnage moins précis et donc d'un potentiel rendu de mauvaise qualité par rapport au lancer de rayons classique.
Elle est utilisée afin de réduire le coût :
* de projection des algorithmes de rendu orientés objets.
* des lancers de rayon des algorithmes orientés image.

## Placage de texture

Le placage de texture sur des objets géométriques est aujourd'hui réalisé de manière matérielle par la plupart des systèmes graphiques 3D. Il est donc aisé de visualiser des tranches du volume pour un temps de calcul modique.
Ces tranches peuvent être alignées avec le volume et rendues avec une orientation dépendant de la position du point de vue. Ce type de visualisation apporte une grande rapidité mais au détriment d'un rendu de qualité moyenne.
Un autre type de visualisation consiste à ré-échantillonner le volume par des tranches alignées avec le point de vue. On gagne ainsi en qualité de rendu mais au détriment du coût de ré-échantillonnage du volume à chaque image.

## Rendu accéléré par le matériel graphique

Une technique récemment exploitée pour accélérer le rendu est l'utilisation de cartes graphiques modernes pour accélérer les algorithmes traditionnels comme le lancer de rayons.
L'apparition des shaders sonna l'avènement de la GPU comme une architecture SIMD très bon marché et idéal pour réaliser toutes sortes de calculs parallèles.
Les pixels shaders sont capables de lire et d'écrire très rapidement la mémoire de texture, d'effectuer des opérations logiques et mathématiques basiques.
Ils se révèlent d'une grande utilité lors de traitements lourds tel que le lancer de rayon et plus généralement le traitement du signal.
Avec OpenGL version 2.0, les shaders sont maintenant capables de fonctionner comme des architectures MIMD (ils sont capables de branchements indépendants) avec 48 unités de traitements parallèles utilisant jusqu'à 1Go de mémoire de texture et des formats numériques d'une grande précision.
Une telle puissance augmente de façon radicale la rapidité d'exécution d'algorithmes comme le lancer de rayon, permettant même de les utiliser pour du rendu en temps réel !