![]() |
Boîte à Outils :
|
tar -zxvf rendertoy.tar.gz
cd rendertoy_bXX
mkdir imgtoy
tar -zxvf imgtoy_latest.tar.gz -C imgtoy
mkdir objtoy
tar -zxvf objtoy_latest.tar.gz -C objtoy
tar -zxvf rendertoy_latest.tar.gz
cd imgtoy
make
make install
cd objtoy
make
make install
export PATH=$PATH:$HOME/local/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/$HOME/local/lib
/* genere N echantillons
*/
Ln= 0.f;
for(i= 0; i < N; i++)
{
/* genere un rayon dans le pixel (x,y) */
camera_sample_pixel(camera,
(float) x + (float) drand48(),
(float) y + (float) drand48(),
model, &ray);
/* trouve le point p visible le
long du rayon pour le pixel (x,y) */
if(ray_intersect(&ray, &p) < 0)
/* pas d'intersection */
continue;
/* determiner l'energie emise par p vers la camera */
Ln+= render_get_Le(render, &p)
/* calculer l'energie reflechie par p vers la camera
*/
/* choisir un point q sur une source de lumiere */
render_sample_light_Le(render, &light_id, &q, &qa);
/* determiner l'energie emise par q vers p */
Le+= render_get_light_emission(render, light_id, &p, &q);
if(Le <= 0.f)
continue; /* passer au pixel suivant */
/* l'energie emise par q est reflechie par p vers l'origine
du rayon */
ray_get_origin(&ray, &o);
brdf= dpoint_brdf_3points(&o, &p, &q);
if(brdf <= 0.f)
continue; /* passer au pixel suivant */
/* verifier que p et q sont
visibles, sinon, ils n'echangent pas d'energie */
if(dpoint_visibility_ray(&p, &q) < 0)
{
/* construire l'estimateur : f(x) / p(x), avec f(x)= Le_q * brdf_p * G(p, q) */
L= Le * brdf * dpoint_get_G(&p, &q);
/* dans ce
cas, p(x) est la probabilite de choisir q sur l'aire des sources de
lumieres */
L= L / qa;
}
else
{
/* p et q ne sont pas visibles ... */
L= 0.f;
}
/* accumuler l'echantillon */
Ln+= L;
}
/* enregistrer le resultat dans l'image */
Ln/= (float) N;
img_set_pix(img, x, y,
Ln, Ln, Ln);
/* rouge= Ln, vert= Ln, bleu= Ln */