2012-12-09 3 views
0

Juste à des fins d'apprentissage, je regardais les techniques de lancer de rayons. J'ai récemment découvert Global Illumation et ses variantes, en lisant ce travail incroyable par Kevin Beason. J'ai essayé de porter smallpt dans une autre langue (Lua).Accélérer l'éclairage global en utilisant des courbes de remplissage d'espace - Comment ça marche?

J'ai quelque chose qui marche bien, jusqu'ici, mais ça rend la scène trop lente à mon avis. Jusqu'à présent, j'ai creusé sur Internet, et j'ai vu dans de nombreux articles techniques couvrant le sujet que c'était le principal problème des techniques d'éclairage global, en particulier le traçage des chemins.

Il me semble qu'il existe des méthodes pour accélérer le processus, telles que l'espacement des courbes de remplissage (courbes de Hilbert, par exemple). Fondamentalement, ils divisent tous la fenêtre en seaux (ou en mosaïques), puis commandent au rendu de traiter le traçage de chemin sur chaque compartiment dans un ordre spécifique. Techniquement, je n'ai pas regardé comment implémenter les courbes de Hilbert, mais je voudrais comprendre comment, concrètement, cela peut rendre l'ensemble du processus plus rapide? Ma première hypothèse était que, compte tenu de chaque seau, le rendu était appelé sur des pixels spécifiques, puis les autres étaient des échantillons utilisant des astuces d'interpolation, mais en réalité, il semble que le rendu est appelé sur chaque pixel du seau. Par conséquent, le moteur de rendu traitera tous les pixels de la carte, ce qui entraîne le même volume de travail que deux boucles imbriquées (pour chaque ligne, chaque colonne), à ​​mon humble avis. Donc, je sais qu'il me manque manifestement quelque chose, je cherche donc des explications claires.

Merci d'avance.

+0

Personne? Voici le lien vers le référentiel du projet, en fait [Smallpt-Lua] (https://github.com/Yonaba/smallpt-lua). Merci. –

Répondre

1

Smallpt est conçu pour démontrer l'illumination globale avec le traçage de chemin dans le plus petit nombre de lignes possible. En tant que tel, il ne présente aucune optimisation des performances.

Pour tout ce qui est plus complexe qu'une simple scène, la plus grande partie du temps de rendu est consacrée au calcul de l'objet qu'un rayon frappe le long de son chemin, comme cela doit être fait plusieurs fois pour chaque rayon.

Une implémentation naïve devra, pour chaque rebond de rayon, calculer l'intersection du rayon avec chaque objet composant la scène, afin de déterminer quel objet est touché ensuite. Pour améliorer ce Les structures d'accélération sont utilisées pour réduire le nombre d'intersections rayons/objets qui doivent être calculées, typiquement en partitionnant le volume entourant la scène pour éviter les tests d'intersection inutiles.

Il existe deux approches principales:

  • KD Trees - liés aux arbres binaires Espace Partitionnement.
  • Bounding volume hierarchy - une hiérarchie de boîtes alignées (habituellement) sur des axes qui entourent des objets et d'autres boîtes.

En ce qui concerne les performances, les deux fonctionnent tout aussi bien, mais je crois que les BVH sont plus simples à mettre en œuvre.

+0

Merci Jon, C'est définitivement ce que je cherchais, des techniques de partitionnement spatial. Je vais regarder dedans. –

+0

Cool. Je recommanderais BVH en premier. J'ai essayé les KD-Trees et même si je les ai finalement fait travailler, ils ne sont pas amusants à déboguer. –

0

Je ne connais pas ce genre de méthode, mais le pavage seul peut aider les performances car il peut améliorer l'utilisation du cache pour les scènes complexes - ie. au lieu de balayer de gauche à droite, errant dans la scène tout en mettant en cache, en faisant des tuiles à la fois, disons, quelques centaines de rayons tombent tous dans la même zone de la scène au lieu de se déplacer gaiement à travers elle, ce qui signifie seules les données de cette zone doivent être dans le cache. Bien sûr, les rayons secondaires sont de toute façon aléatoires, donc si vous utilisez le tracé, le premier rayon n'aura probablement pas beaucoup d'importance. Il pourrait être plus utile pour la cartographie photonique. De toute façon, peut-être que les courbes remplissant l'espace font quelque chose de similaire là-bas. En dehors de cela, je n'ai aucune idée de ce qu'ils pourraient être.

[edit] Essayez de les sortir et voyez si les performances changent.