Bonjour,
Je suis en train d'apprendre le Path Tracing à l'aide d'estimateurs Monte Carlo.
A chaque point d'intersection avec une surface je dois lancer des rayons uniformément dans un hémisphère. Celui-ci est centré sur la normale à la surface.
Dans mon code, je génère uniformément ces rayons dans un hémisphère orienté vers le haut. Cependant si une normale n'est pas orientée vers le haut, ce n'est pas bon.
Comme le montre l'image ci-dessous tirée de http://www.scratchapixel.com/images/...alillum1a.png?
Je veux donc changer de repère. (i.e pivoter la direction générée selon la normale à la surface)
http://www.scratchapixel.com/lessons...implementation
Le site ci-dessus le fait mais je n'arrive pas à avoir les résultats escomptés.
Je passe de coordonnées polaires à cartésiennes.
Voici mon code :
La focntion createCoordinateSystem est une fonction qui crée un nouveau repère avec comme axe Y la normale à la surface. Je comprends cette fonction mais je ne comprends pas pourquoi il inversent les composantes Y et Z lors de la création du vecteur sample.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 createCoordinateSystem(n, Nt, Nb); for (int i = 0; i < samps; ++i) { double r1 = distrib(generator); double r2 = distrib(generator); float sinTheta = sqrtf(1 - r1 * r1); float phi = 2 * 3.14159265359 * r2; float xTemp = sinTheta * cosf(phi); float zTemp = sinTheta * sinf(phi); Vec sample(xTemp, r1, zTemp); Vec v; v.x = sample.x * Nb.x + sample.y * n.x + sample.z * Nt.x; v.y = sample.x * Nb.y + sample.y * n.y + sample.z * Nt.y; v.z = sample.x * Nb.z + sample.y * n.z + sample.z * Nt.z; Ray newR(x, v.norm()); const double f = clamp(n.dot(v.norm())); temp = temp + (shade(newR, depth - 1).mult(obj.c / 3.14159265359) * f) / pdf; } return (temp) / samps;
Qu'est ce qu'il ne va pas avec ce code ?
Merci
Partager