# Compétition de rendu **Nom de l'équipe**: Équipe 3 **Membres de l'équipe**: * Jian Jia * Daniel Milenov Milanov ## Image(s) choisies
brouillon
### Inspiration inspiration inspiration inspiration inspiration inspiration inspiration inspiration **Motivation:** Le thème “Les technologies de l’exploration” nous on fait penser à l’exploration marine. Nous voudrions faire le rendu d’un sous-marin qui découvre un artéfact d’une civilisation perdue. ## Image obtenue **volume + microfacette + carte env bleue** - 4096 spp, 1366x768 temps de rendu : ~6h (avec avg.json) ### variantes : Seulement tâches Jian (volumetrique + carte_env): 4096 spp, 1366 x 768, temps de rendu : 2h 30min Seulement tâches Daniel (microfacettes): 100spp, 1366 x 768, temps de rendu : 6m 19s Finale avec carte environnement noire 1024 spp, 1366 x 768, temps de rendu : 30 minutes Rendu volumétrique + carte environnement (pas de microfacettes) - 2096 spp, 1366 x 768, temps de rendu : 2h Volumétrique + microfacettes + carte environnement + spotlight bleu : 4096 spp, 1366 x 768, temps de rendu : 2h30 ## Répartition du travail # Daniel : ## Liste des fonctionnalités mises en œuvre 1- Matériaux microfacette. 2- Modélisation de la scène blender. ## Fonctionnalité : Matériaux Microfacettes Pour augmenter le réalisme de notre scène nous avons décidé d'implémenté des matériaux microfacettes. Nous avons implémenter plusieurs types de matériaux microfacettes soit, l'implémentation Oren-Nayar, Diélectrique, Conducteur et Transmission. Chacun de nos matériaux utilise le paramètre *roughness* pour répliquer la quantité de microfacettes sur un modèle. ### Oren-nayar Cette implémentation est basée sur la documentation offerte par PBR. Nous utilisons ce matériaux pour avoir des surfaces diffuses plus réalistes. Nous avons aussi emprunter des notions de cette implémentation pour avoir de meilleurs résultats dans les cas où la roughness se rapproche de 1. https://mimosa-pudica.net/improved-oren-nayar.html. De plus, nous avons implémenté une variation de celui-ci dans le but de corriger les cas extrêmes (https://mimosa-pudica.net/improved-oren-nayar.html). Nous utilisons donc, le paramètre imaginaire *p* pour avoir de meilleurs résultats.
lambertienne vs oren-nayar
formule ### Dielectrique Cette implémentation se base sur le modèle de cook-Torrance pour les BRDF microfacette soit une formule qui prend en compte les paramètres suivants : * Fresnel * La fonction de distribution de la normale * Le terme géométrique * Le terme de masque et ombrage * Le jacobien Nous utilison principalement le Fresnel vu en cours et une implémentation GGX car, c'est celle-ci qui nous donne les résultats les plus réalistes. Dans le matériau diélectrique nous faisons que de la réflexion ou de la transmission selon le paramètre *delta* passé en paramètre dans la configuration JSON. Voici les formules GGX utilisées: formule ### Conducteur L'implémentation de matériaux conducteurs est très similaire à l'implémentation diélectrique cependant, nous devons utiliser un fresnel différent pour représente la conservation d'énergie de façon plus réaliste. Nous avons utilisé cette référence pour l'implémentation de notre fresnel: https://seblagarde.wordpress.com/2013/04/29/memo-on-fresnel-equations/. Ce matériau ne fait que de la réflexion. formule ### Transmission Finalement cette implémentation sert à représenter les matériaux transmissible comme de la glace bruité ou d'autres matériaux imparfaits. Encore une fois l'implémentation est proche du matériau diélectrique, mais, il faut modifier notre jacobien et certaines parties de la formule. En comparaison avec les autres matériaux, le matériau de transmission fait de la réflexion **et** de la transmission selon le fresnel, semblable aux matériaux Fresnel-Blend implémentés dans le devoir 3. reflection vs transmissionformule ## Utilisation Nous allons donc, utiliser les différents matériaux microfacettes pour différents objets dans notre scène. Tous nos matériaux diffus sont remplacés par des matériaux oren-nayar, la tête en or et le métal du vaisseau seront des matériaux conducteurs et la fenêtre du vaisseau seras un matériau transmissible. Les méduses garderont leurs matériaux diélectriques, car, nous ferons un autre tour de passe-passe sur ceux-ci pour leur donner une apparence volumétrique.Voici comment nous avons réparti nos matériaux dans notre scène. formule ## Implémentation Pour implémenter ces matériaux nous avons rajouté 4 nouveaux matériaux dans notre liste de matériaux, ils héritent de la classe Material et implémentent evaluate, pdf, is_delta et sample. Chacun des matériaux (sauf Oren-nayar), utilisent notre implémentation du pdf microfacette et font un échantillonnage selon la fonction de distribution de la normale au lieu de faire un échantillonnage selon le cosinus comme pour les surfaces lambertienne. Une fois les matériaux créer nous n'avons qu' à les utiliser dans nos fichiers JSON. formule **Exemple de configuration json** ## Validation Microfacettes Afin de valider nos rendus, nous devons d'abord valider notre échantillonnage. Nous nous sommes basées sur l'implémentation de la source suivante : https://agraphicsguynotes.com/posts/sample_microfacet_brdf/ pour obtenir les formules suivantes pour la pdf et l’échantillonnage. formule Pour l'utilisation de ceux-ci, nous avons rajouté une nouvelle tâche (tâche 7) dans l'exécutable du devoir 3 qui testera notre mise en place et créera des images d'hist, diff pour nous permettre de comparer nos résultats. Voici les résultats : formule Nous pouvons constater que nous avons des problèmes dans la génération du pdf et l'échantillonnage pour oren_nayar soit l'utilisation d'un échantillonnage selon le cosinus. Voici nos résultats pour le rendu de chacun de nos matériaux microfacette selon le paramètre *roughness* : **Oren_nayar** : *roughness des boules : 0.1 0.3 0.5 0.6 0.7 0.95 à 200 spp* Blender (gauche) vs Nous (droite) formule **Dielectric** : Blender (gauche) vs Nous (droite) formule **Conducteur** Nous (première sphère est à 0.1 de roughness) vs Nous sans la première sphère. n1 = 1.0 n2 = 1.3 formuleformule **Transmission** Nous (première sphère est à 0.1 de roughness) vs Nous sans la première sphère. n1 = 1.0 n2 = 1.3 formuleformule Voici notre rendu de notre scène complexe avec des matériaux de base (devoir 3): **blender** vs **devoir 3** (200 samples, 7m:08s, 1.005 intersections/rayon) vs **microfacettes** (200 samples, 6m:19s, 0.996 intersections/rayon) formule Nous pouvons constater que plusieurs de nos implémentations n'ont pas les mêmes résultats que nos scènes dans blender. L'implémentation de oren-nayar nous donne des images beaucoup plus sombres et il est difficile de voir l'impact du paramètre *roughness* sur une forme. Dans le contexte des autres matériaux, nous pouvons voir que les valeurs proches de 0 nous donnent des résultats complètement faux et contaminent notre scène. Au contraire, avoir un roughness proche de 1 rend notre sphère complètement noire. Nous pouvons expliquer ces résultats en disant que l'implémentation est erronée, mais les résultats sont tout de même intéressants dans notre scène finale. ### Difficultés rencontrées Les premiers problèmes rencontrés ont été la difficulté de compréhension concernant l'utilisation du half-vector dans notre implémentation courante et les problèmes d’échantillonnage et pdf avec notre implémentation d'oren-nayar. Cependant la plus grande difficulté est la validation de nos implémentations. Il est difficile de comparer nos matériaux avec des logiciels comme blender car, ils appliquent du denoising et des algorithmes de post-processing par dessus leur résultat. De plus, trouver des matériaux dans blender qui suivent exactement notre implémentation est très difficile. Blender offre plusieurs paramètres avec lesquels nous devons jouer, mais, il est impossible de deviner quelle est la bonne combinaison. ## Fonctionnalité : Scène Blender Pour avoir une scène intéressante, il faut tout d'abord la modéliser. Nous avons modélisé plusieurs scènes pour aider aux prototypages de nos implémentations. Chacune des scènes était une version plus simple de la scène finale. Les éléments importants dans notre scène sont le vaisseau, les méduses, l'environnement et la tête en or. Le vaisseau a été conçu en prenant un modèle 3d existant et en le démontant pour avoir un modèle personnaliser. L'environnement consiste d'un plan subdiviser plusieurs fois qui a été sculpter dans blender pour lui donner une apparence onduler, d'algues, de roches avec des textures, des étoiles de mers et d'anatifes. Pour la tête en or, nous avons juste pris un modèle 3d détaillé et l'avons placé dans notre scène. ### Difficultés rencontrées Lors de nos rendus nous avons remarquer que les normales doivent être bien ajustées face à la lumière sinon, les rendus étaient très sombres et complètement inutiles. De plus, chacun de nos objets doit être subdivisé pour le rendre détaillé, car, sinon nous n'avons pas assez de normales pour répartir la lumière. Cela est dû au fait que chacun de nos objets dans notre scène blender est un maillage composé de triangles. En addition, nous avons vu plus haut que l'utilisation de microfacettes assombrissent la scène rapidement alors pour combler ce problème nous changeons le *roughness* pour nos matériaux pour avoir de meilleurs résultats. Malgré le fait que nous n'utilisons pas les valeurs représentant la réalité, nos scènes sont mieux illuminées. **Comparaison** scène à 100 spp avec valeurs microfacettes réaliste vs scène à 100 spp avec valeurs microfacettes avec *roughness* plus petit. formule # Jian : ## Fonctionnalité : Volume Homogène avec Bordure On modèlise le milieu sous la surface de l'eau comme un volume homogène englobant toute la scène. Aussi, les méduses sont des volumes plus denses qui sont englobés par leur maillage (bordure). Ces deux idées nécessitent la mise en oeuvre du volume homogène avec bordure dans le projet. La fonction de phase isotrope est choisie pour sa simplicité, la seule paramètre est albedo, qui détermine la perte d'énergie et donne l'apparence de couleur dans le volume. À cause que les méduses sont dans l'eau, il faut aussi que les volumes peuvent s'englober sans comportement étrange. ### Volume homogène isotrope sphèrique volume architecture La classe `ConstantMedium` est une sous-classe de `Shape`, donc elle va override la fonction `hit()`. Pour déterminer s’il y a une réflexion dans le volume, `neg_inv_density` est utilisé pour échantillonner une distance aléatoire. Cette distance va être comparée aux intersections de deux rayons à la forme du volume - `m_shape`. La première mise en oeuvre va seulement utiliser le `Sphere` comme forme englobante. Ces deux intersections donnent les deux points que le rayon traverse sur la surface du volume s’il n'y a pas de réflexion dans le volume. volume hit ### Validation histogram isotropic histogram isotropic histogram isotropic Les images générées par les tests devoir 3 du matériel Isotropic (histogram, diff, pdf). Elles sont pareilles que celles pour échantillonnage sphérique.
volume light cornel box
4096 spp Volume: density=0.001\ radius=1500\ albedo=(0.6,0.6,0.9)
volume in volume cornel box
1024 spp Volumes: \ density=0.002/0.002/0.005\ radius=300/200/100\ albedo=(1.0,1.0,1.0)
volume spotlight cornel box
1024 spp \ Volumes: \ density=0.001\ radius=1500\ albedo=(1.0,1.0,1.0)
### Volume englobant avec maillage comme bordure Une façon simple et intuitive de simuler le subsurface scattering est d'avoir une surface diélectrique comme bordure d'un volume homogène. C'est notre approche pour faire les "têtes" des méduses. Pour y arriver, `m_shape` dans la classe ConstantMedium peut aussi être un BVH. Comme ça, on garde la performance du BVH, et le code dans `ConstantMedium::hit()` reste presque pareille. La seule modification est d'ajouter le cas quand le rayon origine en dehors du volume, et rentre dans le volume pour la première fois. Dans ce cas-ci, on veut échantillonner le matériel (BSDF) de la surface, qui va être `dielectric`. Aussi, la surface BSDF est utilisée quand le rayon sort du volume, en autres mots quand le rayon origine dans le volume, et `hit()` retourne faux. Cette approche est limitée aux maillages convexe et watertight, parce qu'on teste seulement deux intersections par rayon sur le même maillage. Ce problème n'est pas critique pour les maillages de méduses, mais doit être réglé si on utilise des bordures plus complexes, par exemple le dragon. BVH changes ### Validation
volume avec bordures scene classic
4096 spp Avec maillages non-convexes, BSDF surface seulement en entrant. Il y a des problèmes. Ex. le pied du dragon, les oreilles du lapin.
volume avec bordures scene classic, exiting surface BSDF
4096 spp Avec maillages non-convexes, BSDF surface en entrant et en sortant. Certaines régions sont très différentes.
volume avec bordures jellyfish
4096 spp La méduse
scene avec volume et jellyfish
4096 spp La scène avec volume englobant sphérique, et les méduses (`dielectric` + `volume`).
### Difficultés rencontrées La difficulté principale est de bien traiter les intersections avec la bordure du volume. `Ray Tracing the Next Week` est une bonne place pour commencer, mais la complexité augmente avec MIS, BVH, les conditions sur les bordures, etc. Avec `Isotropic`, la fonction `evaluate()` ne peut pas multiplier par un cosine comme d'habitude, parce qu'on garde toutes les directions sphériques. Aussi, la bonne valeur de densité n'est pas facile de deviner pour chaque volume, nécessitant des essais-erreur qui prennent beaucoup de temps. Nous n'avons pas eu le temps de regarder des algorithmes pour accélérer le rendu du volume, ou d'ajouter la fonction de phase anisotropique, qui est plus réaliste pour l'eau. ## Fonctionnalité : Carte Environnement avec Échantillonnage par Importance Avec une texture qui représente la lumière environnement directionnelle, on peut ajouter beaucoup de réalisme. L'approche simple `path tracing` est de convertir la direction du rayon quand il ne touche pas la scène à un UV sur la texture. On convertit la direction normalisée aux deux angles `theta` et `phi`, et map dans une étendue de 0 à 1. Cette approche a été mise en oeuvre dans `scene.h`. Pour avoir plus de contribution par itération, il faut échantillonner cette source par importance. On doit donner un `pdf` à chaque texel, en fonction de sa valeur lumineuse comparée au total des texels. Le total des `pdf` doit donner 1. Les fichiers `environment.h`, `Scene.h`, `Scene.cpp`, `path_mis.h`, `environment_emitter.h`, `Vec.h` ont été ajoutés ou modifiés pour cette tâche Les classes de distribution 1D et 2D dans `Vec.h` viennent de PBRT. La classe `Environment` est un `Shape`, qui est un membre de `Scene`. `path_mis.h` l'utilise comme un émetteur extra. La construction de la distribution et de l'émetteur est dans `Scene.cpp`, qui contient aussi des tests avec images générées. ### Difficulté Cette fonctionnalité n'est pas bien testée, le pdf s'ajoute à 1 dans les tests effectués dans `Scene.cpp` (ligne 140-), mais pas avec `generate_histogram()`. Avec des valeurs très élevées de couleur (HDR) ou des pdf trop petits, des "fireflies" peuvent être introduits. Les imprécisions numériques vont être importantes si les pdfs sont trop petits, ça peut même être la cause d'un crash (`invalid vector subscript`). ### Validation
head avec low res image
64 spp Texture base résolution, avec les deux stratégies de `path_mis`.
head avec low res image
64 spp Texture base résolution, sans échantillonner par importance. On voit moins de détail.
texture exemple texture to maxelem texture to pdf
1. Texture 2. texture convertie en fonction de maxelem(texel) 3. image avec pdf pour chaque texel, plus difficile à visualiser parce que chaque pdf est trop petit.
## Image finale - [retourner à image obtenue](#image-obtenue) # Sources Rendering Jellyfish - CS348B Final Project. (n.d.). Graphics.stanford.edu. Retrieved November 3, 2022, from http://graphics.stanford.edu/~kayvonf/misc/jellies/proposal.html Three types of marine algae you need to know. (n.d.). Aquarobotman Store. https://aquarobotman.com/blogs/underwater-sea-creatures/three-types-of-marine-algae-you-need-to-know Small Translucent Fish In An Aquarium On A Green Algae Background. Selective Focus, Banner Format Stock Photo - Image of ecology, defocused: 217214042. (n.d.). Www.dreamstime.com. Retrieved November 3, 2022, from https://www.dreamstime.com/small-translucent-fish-aquarium-green-algae-background-selective-focus-banner-format-amazing-underwater-life-image217214042 https://www.artstation.com/artwork/ybGGk3 https://www.artstation.com/artwork/Eag0Xn film godzilla : king of monsters https://www.thingiverse.com/thing:5155301/files https://thangs.com/search/barnacles?scope=all https://www.cgtrader.com/free-3d-models/plant/other/seaweed-6c855842-c6ff-4078-86d3-f521d78f445b https://www.cgtrader.com/free-3d-models/vehicle/other/cyclops-subnautica