@@ -18,6 +18,39 @@ il y a 2 codes de tests dans `projects` :
...
@@ -18,6 +18,39 @@ il y a 2 codes de tests dans `projects` :
il est possible de changer de sampler pour faire quelques comparaisons, il suffit de modifier le typedef
il est possible de changer de sampler pour faire quelques comparaisons, il suffit de modifier le typedef
au début des sources. les samplers eux mêmes sont dans :
au début des sources. les samplers eux mêmes sont dans :
- projects/sampler.h : il y a le generateur standard c++ et 2 generateurs basés compteurs,
-`projects/sampler.h` : il y a un générateur standard c++ et 2 générateurs basés compteurs,
- projects/sampler_sobol.h : la sequence sobol classique, avec max 128 dimensions, la version avec une évaluation "rapide" dans l'ordre des codes de gray
-`projects/sampler_sobol.h` : la séquence sobol classique, avec max 128 dimensions, la version avec une évaluation "rapide" dans l'ordre des codes de gray, et les 2 acceptent un scrambling simple, random digit shift,
- projects/owen_fast.h : les permutations d'owen (à utiliser sur un échantillon sobol).
-`projects/owen_fast.h` : les permutations d'owen (à utiliser sur un échantillon sobol).
voila quelques suggestions, à faire (ou pas) dans l'ordre que vous préferrez.
## réduction de dimensions
vous pouvez appliquer les différentes stratégies de réduction de dimensions au path tracer :
- passer de 3d à 2d dans la sélection des sources, et dans la génération des directions en fonction des matières,
- réutiliser les mêmes nombres aléatoires pour estimer les 2 intégrales, cf la fonction `direct_mis()`.
le nombre de dimensions comsommées est affiché à la fin du calcul.
j'ai "laissé" la dernière amélioration en place, qui permet d'économiser un rayon par rebond et par pixel.
les matières sont dans `src/gltf/brdf.h` et les sources de lumières (uniquement des triangles émissifs) se trouvent dans `src/gltf/sources.h`.
## sélection des sources
vous pouvez également modifier la stratégie de sélection des sources dans `src/gltf/sources.h`. la solution actuelle construit une variable aléatoire discrète et inverse sa cdf pour sélectionner une source proportionnellement à son aire.
et par rapport à son angle solide ? c'est mieux ou pas ? dans quels cas ?
cf [wikipedia](https://en.wikipedia.org/wiki/Solid_angle#Tetrahedron) pour calculer l'angle solide d'un triangle
## multiple importance sampling
vous pouvez facilement modifier l'heuristique utilisée pour combiner les 2 stratégies dans la fonction `direct_mis()`.
ie utiliser balance au lieu de power comme c'est le cas dans le code.
il y a 2 estimateurs MIS, la version "multi-sample" et la version "one-sample". que faut-il modifier pour écrire la version "one-sample". quelles sont les différences en temps de rendu, en erreur ?
## owen
il y a un bug numérique dans les permutations d'owen, cf `projects/owen_fast.h`. vous pouvez vous en rendre compte en comparant les images calculées avec Owen et OwenFast pour peu d'échantillons (< 16).