Boîte à Outils :
RenderToy


    Qu'est ce que c'est ?
    Télécharger / Installer
    Documentation
    Exemples






[revenir à la page d'accueil]



Qu'est ce que c'est ?


    RenderToy est un ensemble de fonctions (ou librairie) permettant de simplifier l'écriture d'algorithmes de rendu.
    La librairie est décomposée en 3 parties principales :
  1. imgToy, visualisation / lecture / ecriture / conversion d'images HDR (high dynamic range) et tga
    notamment utilisée pour enregistrer l'image résultat de la simulation. [Documentation]

  2. objToy, visualisation / lecture / ecriture / conversion d'objets aux formats maya .obj et .off
    permet de charger des scènes 3D simples aux format maya et off. [Documentation]

  3. render, ensemble de fonctions permettant de : [Documentation]


Télécharger / Installer


archive complète : rendertoy.tar.gz


Copiez l'archive dans un répertoire de travail et décompressez la :
tar -zxvf rendertoy.tar.gz

Un dossier rendertoy_bXX se crée (XX correspond au numéro de version), placez vous dans ce répertoire :
cd rendertoy_bXX

Décompressez les 3 librairies dans un répertoire particulier, par exemple :
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


Il ne reste plus qu'à construire et installer les libraries :

imgtoy nécessite libsdl et glew, vérifiez qu'elles sont installées, puis construisez et installez la librairie :
cd imgtoy
make
make install


objtoy nécessite également libsdl, construisez et installez la librairie :
cd objtoy
make
make install


Vous pouvez modifier les répertoires par défaut en modifiant les directement les variables dans les fichiers Makefile des librairies.

Les librairies objtoy et imgtoy s'installent par défaut dans $(HOME)/local/. Les .h sont placés dans $(HOME)/local/include, les .so dans $(HOME)/local/lib et les éxécutables dans $(HOME)/local/bin. Vous pouvez modifier la variable PREFIX dans les Makefile pour les installer où vous le souhaitez.

Pour utiliser facilement les éxécutables fournis avec les libraries, modifiez la variable PATH, pour bash :
export PATH=$PATH:$HOME/local/bin

Pour utiliser les librairies dynamiques (les .so), il sera peut etre nécessaire de modifier la variable LD_LIBRARY_PATH, pour bash :
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/$HOME/local/lib

Si vous souhaitez que ces variables conservent leurs valeurs pour une prochaine session, ajoutez les mêmes lignes dans .profile, ou .bashrc, selon le cas.

imgtoy fournit viewhdr qui permet de visualiser des images tga et hdr ainsi que de corriger leur saturation et gamma et de les enregistrer en tga.
objtoy fournit mob qui permet de visualiser des objets 3D aux formats .obj et .off et de les enregistrer en .obj.



Documentation

    La documentation est composée de plusieurs parties :
  1. imgtoy
  2. objtoy
  3. render
  4. model
  5. camera
  6. dpoint
  7. ray


    Les exemples suivants sont organisés sous forme de FAQ :
  1. Charger un modèle et créer un objet RENDER,
    avec model_load_obj(), render_new()
    exemple complet

  2. Créer une camera et générer un rayon dans un pixel (x, y) de l'image,
    avec camera_set_projection_opengl(), camera_sample_pixel()
    exemple complet

  3. Trouver l'objet et le point P, visible le long du rayon,
    avec ray_intersect()
    exemple complet

  4. Déterminer si le point P émet de la lumière,
    avec render_get_Le()
    exemple complet

  5. Choisir un point Q aléatoirement à la surface d'une source de lumière,
    avec render_sample_light_Le()
    exemple complet

  6. Calculer l'énergie émise par Q, le point de la source de lumière, vers le point P,
    avec render_get_light_emission()
    exemple complet

  7. Déterminer si P et Q sont visibles,
    avec dpoint_visiblity_ray()
    exemple complet

  8. Calculer l'énergie réfléchie par P vers la camera,
    avec dpoint_brdf_3points()
    exemple complet

  9. Calculer l'éclairement direct du point P.
    exemple complet, cf. ci-dessous.

  10. Trouver le point Q visible du point P dans une direction choisie aléatoirement selon une distribution proportionnelle au cosinus à la normale en P, et connaître la probabilité de Q ?
    avec dpoint_sample_cos()

  11. Choisir une direction uniformément ?
    avec dpoint_sample_direction()

  12. Reformuler une probabilité sur les directions en probabilité sur les aires ?
    avec dpoint_get_dWdA()

  13. Calculer le terme G(p q) de l'équation de rendu ?
    avec dpoint_get_G()


Exemples

   
    calculer l'éclairement direct pour le pixel (x, y) de l'image :

            /* 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 */