EnglishРусскийTürkçeDeutschFrançais À propos · RSS
WebInterface.org
WebInterface.org

Notes sur le dessin, l'imprimé, la photographie et les images faites par ordinateur.

Accueil · Graphisme en trois dimensions · Lancer de rayons

Lancer de rayons

Un lanceur de rayons colore un échantillon en suivant une ligne. La ligne part de la caméra, d'une lampe, ou d'un impact précédent, et elle file dans une seule direction jusqu'à ce que l'algorithme s'arrête. La première question est géométrique. Quelle surface est la plus proche le long de cette ligne ? Arthur Appel, chez IBM en 1968, s'est servi de ce test pour ombrer des solides et pour marquer les zones d'ombre. Le modèle de Turner Whitted, en 1980, a continué. Depuis l'impact, il pouvait envoyer un rayon de réflexion, un rayon de réfraction, et un rayon d'ombre vers chaque lampe. L'infographie en trois dimensions mène la suite jusqu'à l'équation de rendu de Kajiya, en 1986, et jusqu'au path tracing, qui remplace l'arbre fixe de Whitted par des échantillons au hasard. Lumière, matière et image calculée dit ce que ces échantillons coûtent, et le bruit qu'ils laissent.

La recherche mange le temps. Quand une scène contient plus de triangles qu'on n'a envie d'essayer un par un, tester chaque triangle contre chaque rayon passe le gros du temps sur des ratés qu'une boîte aurait écartés. Une structure d'accélération, très souvent une hiérarchie de volumes englobants, range les primitives dans des boîtes emboîtées. Le rayon ne parcourt que les boîtes qu'il rencontre vraiment. Le modèle de caméra, le matériau et le choix du rayon suivant changent avec l'algorithme. La marche, elle, est commune.

Steven G. Parker, James Bigler, Andreas Dietrich, Heiko Friedrich, Jared Hoberock, David Luebke, David McAllister, Morgan McGuire, Keith Morley, Austin Robison et Martin Stich ont décrit une façon de partager cette marche dans OptiX: a general purpose ray tracing engine, ACM Transactions on Graphics, volume 29 (2010), 13 pages, DOI 10.1145/1778765.1778803. McGuire était au Williams College et chez NVIDIA. Les autres auteurs étaient chez NVIDIA. La version de 2010 tournait sur les GPU Quadro, GeForce et Tesla de la société, par CUDA. Les traceurs interactifs plus anciens, OpenRT, Manta, Razor et Arauna parmi eux, étaient bâtis autour d'un moteur de rendu ou d'une machine. Les travaux qui avaient déjà mis le lancer de rayons sur un GPU couraient après la vitesse. OptiX courait après un modèle de programmation.

Le moteur ignore ce qu'est une lampe. L'ombre et la réflectance n'y sont pas non plus. Elles appartiennent au programme qui l'a appelé. OptiX fournit une poignée de petits programmes, chacun écrit pour un seul rayon, et un compilateur à la volée qui les assemble en un noyau. Le programmeur écrit toujours la récursion, comme le fait un shader à la Whitted. Le groupement, le réordonnancement et la construction de la structure d'accélération restent dans le moteur. Un programme pour l'impact le plus proche ne répartit pas le travail sur le GPU.

Les programmes

Sept types de programmes traitent un rayon à la fois. Un programme de boîte englobante se tient à côté et travaille sur la géométrie, pas sur un rayon, pour que la structure d'accélération ait une boîte où ranger le primitif. L'article compte ce programme à part. Le tableau donne l'ensemble.

ProgrammeQuand il tourne
Génération de rayonsL'entrée. Souvent une copie par pixel.
IntersectionPendant la marche. Ce primitif touche-t-il le rayon, et où ?
Boîte englobanteÀ la construction. Une boîte qui contient sûrement le primitif.
Impact le plus procheUne fois, à l'impact le plus proche. Le shader de surface.
Impact quelconqueÀ chaque impact signalé, dans n'importe quel ordre. Peut arrêter le rayon, ou sauter l'impact.
AbsenceLe rayon a quitté la scène. Une couleur de fond, ou une carte d'environnement.
ExceptionLe rayon a échoué, ou le code de l'utilisateur a lancé une erreur.
Visite de sélecteurSur un nœud sélecteur. Choisit l'enfant dans lequel le rayon entre.

La génération de rayons est l'entrée d'un lancement. Un appel démarre beaucoup de copies. Avec la caméra habituelle, chaque copie construit un rayon pour un pixel, le lance, et range une couleur. Le même type de programme peut semer des photons, précalculer l'éclairage, ou prendre des requêtes de rayons qu'une passe OpenGL a déjà mises en file. L'intersection est le test géométrique. Triangle, sphère, cylindre, ou une forme sans maillage du tout. La figure 1 de l'article montre un ensemble de Julia procédural. La boîte d'un primitif procédural n'est parfois qu'une estimation. L'estimation doit contenir le primitif. Une boîte trop lâche allonge la marche. L'image, elle, ne change pas.

L'impact le plus proche ne tourne qu'une fois, une fois le croisement le plus proche connu. C'est le shader de surface. Il peut ombrer, il peut tirer d'autres rayons, et il écrit le résultat dans la charge utile du rayon. L'impact quelconque tourne en chemin, une fois par croisement que la marche signale, et les signaux peuvent arriver dans le désordre. De là, le rayon peut mourir tout de suite. C'est le bon comportement pour un rayon d'ombre qui a trouvé un obstacle. L'impact peut aussi être ignoré. C'est ainsi qu'une texture alpha perce un trou sans relancer la recherche. L'absence tourne quand rien n'a été touché dans l'intervalle. Une couleur de fond plate, ou une carte d'environnement, se range là. L'exception tourne quand un rayon échoue : la pile de récursion a dépassé la mémoire gardée pour ce fil, ou un indice de tampon était hors limites. Le code de l'utilisateur peut lancer sa propre exception. La visite de sélecteur tourne sur un nœud grossier et choisit un enfant. Le niveau de détail est l'usage simple. Un rayon lointain reçoit le modèle grossier.

La charge utile est un enregistrement que l'utilisateur définit et attache au rayon. Le résultat d'ombrage et l'atténuation de l'ombre voyagent dedans. Il n'y a pas de structure d'éclairage fixe où écrire. Les applications dessinées dans la première figure de l'article sont le path tracing, l'ensemble de Julia, la carte de photons, des tests de ligne de visée et de collision à grande échelle, l'ombrage de Whitted sur une géométrie mobile, et l'occlusion ambiante. Le résumé nomme encore la détection de collisions, des requêtes pour l'intelligence artificielle, et un travail scientifique comme la propagation du son. Dans ce dessin, un rayon est une requête. L'image est une sorte de réponse.

Le graphe de scène

La géométrie tient dans un contexte, sous la forme d'un graphe orienté. Un nœud groupe a des enfants et une structure d'accélération. Il peut être le haut d'une marche à deux niveaux, façon courante de déplacer des objets rigides sans reconstruire tout l'arbre. Un groupe de géométrie est une feuille. Il tient les primitives et les matériaux, et il a sa propre structure d'accélération. Un nœud de transformation a un enfant et une matrice de 4 par 3, de quoi faire une application affine. Un nœud sélecteur a des enfants et un programme de visite. N'importe quel nœud peut être la racine, si bien qu'un rayon de caméra et un rayon d'ombre peuvent partir dans des graphes différents. Un nœud peut avoir plusieurs parents. C'est l'instanciation : un maillage en plusieurs endroits, un matériau partagé par des formes dont les tests d'intersection diffèrent.

Une instance de géométrie fait la jointure. Elle lie un objet géométrique à un jeu de matériaux. Les programmes d'intersection et de boîte sont rattachés à la géométrie. Les programmes pour l'impact le plus proche et pour l'impact quelconque sont rattachés au matériau. La coupure est voulue. Un format de triangles déjà utilisé par un rastériseur peut rester dans ce format, parce que le programme d'intersection le lit là où il se trouve. Une copie vers un maillage propre au traceur n'est plus le prix d'entrée.

En 2010, la formule de réflexion était déjà vieille. Ce qui restait ouvert, c'était une recherche programmable sur une machine parallèle, qu'un nouvel algorithme n'aurait pas à réécrire. Quand l'image de synthèse devint courante, on calculait une image par lancer de rayons pendant qu'elle était encore à l'écran.

Avant: Des images qui semblent seulement profondes