TD2 - BRDF de Ward

1. Éclairage direct

Afin d’implementer la brdf on utilise la formule suivante :

$$ f_r(\vec{i}, \vec{o}) = \frac{\rho_s}{4 \times \pi \times \alpha_x \times \alpha_y \times \sqrt{(\vec{i} \cdot \vec{n}) \times (\vec{o} \cdot \vec{n})}} \times e^{-\frac{\left(\frac{\vec{h} \cdot \vec{x}}{\alpha_x}\right)^2 + \left(\frac{\vec{h} \cdot \vec{y}}{\alpha_y}\right)^2}{\left(\vec{h} \cdot \vec{n}\right)^2}} $$

Où : \(h = \frac{\vec{i} + \vec{o}}{\left\lVert \vec{i} + \vec{o} \right\rVert}\)

Afin de vérifier et visualiser la \(BRDF\) on utilise l’integrateur direct. Ainsi, on obtien les résultats suivants :

1$$\alpha_x = \alpha_y = 0.01$$ 2$$\alpha_x = \alpha_y = 0.1$$ 3$$\alpha_x = \alpha_y = 0.25$$ 4$$\alpha_x = \alpha_y = 0.5$$
5$$\alpha_x = 0.2 ~~~ \alpha_y = 0.1$$ 6$$\alpha_x = 0.5 ~~~ \alpha_y = 0.1$$ 7$$\alpha_x = 0.1 ~~~ \alpha_y = 0.2$$ 8$$\alpha_x = 0.1 ~~~ \alpha_y = 0.5$$

2. Échantillonnage uniforme de la BRDF

Dans cette partie on cherche à simuler un matériaux glossy. Pour ce faire on lance des rayons depuis la caméra. Quand ces rayons intercepte une surface, on echantillone \(N\) directions sur l’hemisphere orienté dans le plan tangeant à la surface. Puis pour chaque direction on lance un rayon pour évaluer leurs contribution qui sera pondérée par la \(BRDF\), le cosinus term et l’inverse de sa fonction de densité de probabilité (pdf). Ceci nous done l’estimateur suivant :

$$ \langle L_o \rangle = \frac{1}{N} \sum_{1}^{N} L_i \mathbf{p} \cdot \mathbf{n} \frac{1}{pdf} = \frac{\pi}{N} \sum_{1}^{N} L_i $$

Enfin on obtien les résultats suivants :

9$$\alpha_x = \alpha_y = 0.01$$ 10$$\alpha_x = \alpha_y = 0.1$$
11$$\alpha_x = 0.5 ~~~ \alpha_y = 0.1$$ 12$$\alpha_x = 0.1 ~~~ \alpha_y = 0.5$$

3. Échantillonnage préférentiel

Afin de réduire le vruit des images précedentes on vas chercher a echantilloner nos directions non plus dans tout l’hemisphere mais seulement dans le lobe de la \(BRDF\). Ceci est réalisable grace aux formules suivantes :

$$ \theta_h = \arctan\left(\sqrt{\frac{-log(\xi_u)}{\frac{\cos^2(\phi_h)}{\alpha_x^2}+\frac{\sin^2(\phi_h)}{\alpha_y^2}}}\right) $$

$$ \phi_h = \arctan\left(\frac{\alpha_y}{\alpha_x} \times \tan\left(2 \times \pi \times \xi_v \right)\right) $$

Ce qui nous permet de determiner les vecteurs \(\vec{h}\) et \(\vec{o}\) tel que:

$$ \vec{h} = \left[\sin\theta_h \times \cos\phi_h , \quad \sin\theta_h \times \sin\phi_h , \quad \cos\theta_h\right] $$

$$ \vec{o} = 2 \times \left(\vec{i}\cdot\vec{h}\right) \times \vec{h}-\vec{i}$$

Ainsi, on peut visualiser les directions echantillonés avec cette méthode et les images résultantes :

13 14 15 16
17 18 19 20
$$\alpha_x = \alpha_y = 0.01$$ $$\alpha_x = \alpha_y = 0.1$$ $$\alpha_x = 0.5 ~~~ \alpha_y = 0.1$$ $$\alpha_x = 0.1 ~~~ \alpha_y = 0.5$$

En cherchant en integrer la partie diffuse d’un composant de Ward, on cherche à tirré maintenant soit une direction diffuse ou spéculaire. Pour ce faire on viens choisir entre l’un ou l’autre à l’aide du ratio suivant :

$$ \frac{\overline{specularColor}}{(\overline{specularColor} + \overline{diffuseColor})} $$

Avec ceci on obtiens les résultats suivants:

21$$\alpha_x = \alpha_y = 0.01$$ 22$$\alpha_x = \alpha_y = 0.1$$
23$$\alpha_x = 0.5 ~~~ \alpha_y = 0.1$$ 24$$\alpha_x = 0.1 ~~~ \alpha_y = 0.5$$

Liens utiles

Page du td

Archive contenant le code source