Terre vue de l'espace

Texturer une sphère avec Pixel Bender

Le défi : texturer une sphère avec un moteur de rendu par lancer de rayon, puis le porter sur Pixel Bender pour voir ce que ce petit a dans le ventre ! Pour rappel, cet article suit une première recherche dans laquelle je m'étais fixé de ne pas utiliser de polygones pour le rendu (vous comprenez maintenant pourquoi : Pixel Bender).

Cette fois, je ne détaillerai ni le code ni les opérations mathématiques car je ne pense pas avoir fait les calculs de la manière la plus optimisée qui soit, et je ne veux pas me mettre à dos tous les matheux ^^ . Cet article est donc là pour le fun !

Première étape : le rendu par lancer de rayon

Sphère calculée avec un lancer de rayon en AS3

Pour diminuer la boucle, on procède à un rendu par lancer de rayon. Nous n'avons évidemment pas de lumière, les rayons ne feront pas de rebond et se stopperont au contact de notre sphère. En gros pour cette méthode on reprend les calculs détaillés lors de mon premier article mais à l'envers ! On part de la position du pixel à l'écran pour remonter jusqu'à la position {θ ; φ} de la sphère. Avec cette coordonnée sphérique, on peut calculer le pixel correspondant à celui de notre texture. Vous l'avez compris, cela réduit considérablement la boucle que nous avions car on évite de calculer trop de points (ce qui se passait sur les bords de la sphère). Pour calculer une image de 450 x 450 pixels, nous avions une boucle de 2 560 000 itérations. Avec le lancer de rayon, notre boucle fait 450 x 450, soit 202 500 itérations.

Pour cela, on calcule l'équation de chaque droite orthogonale au point de vue. Chacune de ces droites correspond à un pixel de l'écran (on détermine les pixels un à un). Ensuite, on calcule le point d'intersection de chaque droite avec notre sphère (grâce à une petite équation du second degré). L'un des résultats correspond à la face de la sphère qui est de notre côté, et l'autre à la partie que l'on ne voit pas. À partir de là, il est facile d'obtenir la coordonnée sphérique depuis la coordonnée cartésienne de la sphère. On peut ensuite en déduire le pixel correspondant à celui de notre texture.

Grâce à cette méthode, le SWF généré tourne à 4 images par seconde (l'ancien mettait plusieurs secondes avant d'afficher une image). Le rendu est aussi meilleur car cet algorithme est plus précis pour les "bords" de notre sphère.

Deuxième étape : le portage sur Pixel Bender

Nous pouvons porter tous ces calculs en OpenGL Shading Language (langage de Pixel Bender) qui est bien plus rapide que l'ActionScript 3. Résultat ci-contre. Hors navigateur, le SWF tourne à 31 images par seconde, contre 22 dans mon navigateur. Rectification, en 2020 la fréquence a chuté à 6 images par seconde (dans un navigateur).

Rendu de la sphère.