M2PRO - Images
Année 2006-2007

    TP 1 - Vertex Shaders et Géométrie



big guy
(image et modèle disponible dans le SDK nvidia)


Préambule


    Téléchargez et installez les libraries objtoy et sdlkit fournies sur la page du cours.
    Vérifiez le bon fonctionnement du sdlkit_testmain et de glsl_testmain.

    Documentation :

    libSDL Programming Guide

    openGL Shading Language Specification


Partie 1 : mon premier vertex shader

    Reprenez l'exemple du cours :

    on souhaite animer un point dont la position n'est connue qu'à quelques instants. La solution consiste à interpoler la position du point entre sa position de départ et sa position d'arrivé.

    A l'instant t0, le point se trouve en x0, à l'instant t1, le point devra se trouver en x1.
    Connaissant t (compris entre t0 et t1), comment déterminer la position x du point ?

    Ecrivez le vertex shader permettant de réaliser cette animation. Quels paramètres doit connaitre le shader ? Comment les lui transmettre ?
    Ecrivez l'application utilisant le shader.

        remarque : sdlkit et glsl devraient vous faire gagner du temps.


Partie 2 : animation fluide ?

    On souhaite maintenant utiliser l'idée de la partie 1 pour animer un personnage complet.
    Par exemple : le modèle bigguy (nvidia SDK).

t0
t1
t= 8, Image 8 de l'animation
t= 10, Image 10 de l'animation


    Chargez les maillages à deux instants assez éloignés (bigguy_00.obj et bigguy_10.obj, par exemple) et écrivez une fonction d'affichage capable d'interpoler la position de chaque sommet du maillage en fonction du temps.

       remarque : objtoy fournit les fonctions nécessaires : [Documentation et exemple]
       model_vbo_clean (dans model_clean)
       model_set_vertex_norm (dans model)


    Avez-vous des remarques sur la qualité de l'interpolation ? Quels peuvent être les problèmes ? Comment les régler ?

    Vous aurez sans doute besoin de SDL_GetTicks (cf. SDL_PG) pour vous repérer dans le temps (cette fonction renvoie le temps en millisecondes depuis le début de l'éxécution du programme).

    Chargez tous les maillages et reconstruisez l'animation complète.

Exemple : parcours des sommets d'un model

    FACE *face;
    float *normale;
    float *sommet;
    float *tex;
    int i, n;

    /* nombre de faces du modele */
    n= model_get_faces_n(model);
    for(i= 0; i < n; i++)
    {
        /* obtenir un pointeur sur la face i */
        face= model_get_face_ptr(model, i);

        /* obtenir le nombre de sommets qui composent la face */
        if(face_get_vertex_n(face)==3)
        {
            /* la face est un triangle
             */

             /* récupérer la normale de la face */
            normale= model_face_get_norm_ptr(model, face);

             /* récupérer les coordonnéees des 3 sommets */
            sommet= model_face_get_vertex_ptr(model, face, 0);

             /* recuperer la normale du sommet */
             normale= model_face_get_vertex_norm_ptr(
model, face, 0);

             /* récupérer les coordonnées de texture du sommet */
             tex= model_face_get_vertex_texcoord_ptr(model, face, 0);

            sommet= model_face_get_vertex_ptr(model, face, 1);
            sommet= model_face_get_vertex_ptr(model, face, 2);
        }
        else if(face_get_vertex_n(face)==4)
        {
            /* la face est un quad
             */

             /* récupérer les coordonnéees des 4 sommets */
            sommet= model_face_get_vertex_ptr(model, face, 0);
            sommet= model_face_get_vertex_ptr(model, face, 1);
            sommet= model_face_get_vertex_ptr(model, face, 2);
            sommet= model_face_get_vertex_ptr(model, face, 3);

             ...
        }
    }


Partie Subsidiaire : Vertex ARray et Vertex Buffer Object

    Construisez une primitive indéxée simple : un cube par exemple. Affichez-le.
    Utilisez model_vbo_clean pour ré-organiser le maillage afin de pouvoir l'afficher comme une primitive indéxée (VAR).
    Utilisez un VBO (Vertex Buffer Object) pour stocker votre primitive indéxée sur le GPU.

    [Documentation]


Partie Subsidiaire : Matière et Lumière

    Le modèle définit les coordonnées de texture pour chaque sommet, écrivez un fragment shader qui plaque une texture sur le modèle.
  
    [Documentation]