mikeash.com: just this guy, you know?

next up previous contents
Next: Optimisation de fluide Up: Techniques Previous: Tranches   Contents

Lancer de rayons

La physique de la lumière suggère qu'on utilise des rayons de lumière pour produire notre image. Dans le monde réel, un rayon passe dans un objet et puis il entre dans l'oeil. Dans notre monde virtuel, la réalité est reproduite à partir du même principe, par un rayon qui parcourt le même chemin dans l'autre sens. Ainsi à partir d'un écran virtuel devant notre cube volumique, des rayons sont lancés de la caméra vers cet écran. Le rayon traverse le cube, et un ensemble d'échantillons comme illustré par la figure 6 permet de calculer la couleur finale du point sur l'écran virtuel.

Figure: Le chemin d'un rayon lancé dans le cube volumique. Les voxels gris sont les échantillons.

Par exemple, dans notre cas, les valeurs dans les données volumiques représentent une densité, et on peut tout simplement cumuler les valeurs de la manière suivante pour déterminer la transparence du cube :


\begin{displaymath}pixel = transparence \times \sum_{rayon} voxel \end{displaymath}

Le nombre d'échantillons est un paramètre de l'algorithme de lancer de rayons. Dans la réalité la couleur d'un rayon dans une matière transparente est proportionnelle à l'épaisseur de la matière et la transparence de la matière. Alors la couleur devient plus forte quand le rayon est plus long. Donc le rayon prend un nombre d'échantillons proportionnel à la longueur du rayon.


\begin{displaymath}\acute{e}chantillons = k_1 \times dim \times longeur(rayon) \end{displaymath}

Il faut aussi décider le nombre de rayons à lancer dans le cube, c'est à dire la taille de l'écran virtuel. L'écran virtuel est un carré de taille $dim_{\acute{e}cran}$. Pour notre implantation de lancer de rayons, on a décidé de faire un calcul proportionnel à la taille du cube volumique :


\begin{displaymath}dim_{\acute{e}cran} = k_2 \times dim_{cube} \end{displaymath}

Quand le cube est directement face à la caméra avec $k_2 = 1$, il y a exactement un rayon par voxel dans le plan qui est plus proche de la caméra. Le cube est exactement conforme à l'écran virtuel. Chaque rayon lancé de la caméra à l'écran virtuel a un point d'intersection avec le cube.

Par contre, si le cube tourne et si son bord ou son coin est face à la caméra, il y a beaucoup de rayons qui ne coupe pas le cube, car le cube n'est pas conforme à l'écran virtuel (Voir Figure 7). Il y a le même nombre de rayons lancé, mais moins de rayons qui passent dans le cube. Alors le rendu devient moins coûteux car il y a moins de rayons à tracer, mais la qualité du rendu diminue.

La valeur de $k_1$ n'est pas fixée. Quand $k_1$ est petit, chaque rayon prend moins d'échantillons qui donne un rendu plus rapide mais avec moins de qualité. Quand $k_1$ est grand, chaque rayon prend plus d'échantillons qui donne une qualité supérieure mais le rendu devient plus coûteux. Alors en variant ce paramètre, il est possible d'échanger entre le coût du rendu et la qualité du résultat, que nous appellerons le niveau de détail (LOD). Ce paramètre change le nombre d'échantillons qui sont pris sur la profondeur du cube, alors nous appellerons ce paramètre $LOD_{profondeur}$.

Avec la même idée, la valeur de $k_2$ est aussi un paramètre de LOD. Quand $k_2$ est petit, le nombre de rayons lancés à l'écran diminue, et le rendu devient moins coûteux. Quand $k_2$ est grand, il y a plus de rayons lancés et le rendu devient plus coûteux, mais la qualité de l'image final augmente. Ce paramètre change le nombre de rayons sur le plan de l'écran virtuel, alors nous appellerons ce paramètre $LOD_{planar}$

Figure: À gauche : le cube est face à la caméra. Le nombre de rayons égale le nombre de voxels dans le plan. À droite : le cube tourne. Le nombre de rayons qui coupent le cube diminue fortement, et on commence à passer des voxels.

Pour avoir une qualité d'image et une vitesse constante, il faut varier le paramètre de $LOD_{planar}$ en fonction de l'orientation du cube volumique. Quand le cube n'est pas face à la caméra, il faut lancer plus de rayons à l'écran virtuel pour que le même nombre de rayons coupe le cube volumique. Une possibilité serait d'analyser la relation entre l'orientation du cube et le proportion de rayons lancés qui coupe le cube. Cette analyse donnerait le $LOD_{planar}$ pour une orientation du cube quelconque qui garde la qualité de l'image constante. Une autre possibilité serait de donner une vitesse désirée et créer un algorithme qui fait varier le $LOD_{planar}$ en fonction de cette vitesse et la vitesse réalisée. Si la vitesse est inférieure au but, l'algorithme diminue le $LOD_{planar}$ pour augmenter la vitesse du rendu, et si la vitesse est supérieure au but, l'algorithme augmente le $LOD_{planar}$ pour donner une meilleur qualité d'image. Notre implantation garde un $LOD_{planar}$ constant.


next up previous contents
Next: Optimisation de fluide Up: Techniques Previous: Tranches   Contents
Michael Ash 2005-09-21

Hosted at DigitalOcean.