M2PRO - Images
Année 2008-2009

    TP 1 - Opérations et Vertex Shaders



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


Préambule

    Téléchargez et installez les libraries objtoy et sdlkit fournies en Annexes.
    Configurez également votre éditeur pour compiler les shaders avec shadercc (inclus dans sdlkit)
    Vérifiez le bon fonctionnement du sdlkit_testmain et de glsl_testmain.

    Documentation :

    openGL Programming Guide

    openGL Shading Language Specification

    openGL man pages
    GLSL quick reference guide

    libSDL Programming Guide


Partie 1 : Opérations

    Reprenez le TP1 du premier semestre et ré-organisez son code proprement en utilisant sdlkit. Les étapes suivantes doivent clairement apparaître :

    initialisation et création du contexte openGL
    boucle d'affichage :
       effacer le buffer de rendu
       placer et orienter la camera
       fixer la projection (en fonction de la largeur et de la hauteur de la fenetre)
       placer, orienter et afficher chaque objet
       échanger les buffers de rendu et d'affichage
    sortie


Partie 2 : Vertex Buffer Objects

    Construisez un objet simple, cube, cylindre ou sphère, par exemple, en stockant sa forme et les attributs de ses sommets dans un vertex buffer object. Dans un premier temps, on se contentera de construire une liste de triangles.

    Construisez une liste de triangles indexés.



    Utilisation simple des fonctions vertexbuffer de sdlkit (pour afficher un modele charge avec objtoy) :

    // creation de la fenetre / contexte openGL
    sdlkit_init(600, 600);
    // initialisation de la librairie vertex buffer
    if(vertex_buffer_init() < 0)
        goto done;

    // creer le vertex buffer
    VERTEX_BUFFER *buffer= vertex_buffer_create(GL_TRIANGLES);

    // declarer une position (vertex) composee de 3 floats
    if(vertex_buffer_add_attribute(buffer, VERTEX_ATTR, 3, GL_FLOAT,
        model->v_n, sizeof(VERTEX), model->v) < 0)
       printf("erreur\n");

    // declarer une normale composee de 3 floats
    if(vertex_buffer_add_attribute(buffer, NORMAL_ATTR, 3, GL_FLOAT,
        model->norm_n, sizeof(VERTEXN), model->norm) < 0)
        printf("erreur\n");

    // declarer un index buffer compose d'entiers non signes
    if(vertex_buffer_add_index(buffer, GL_UNSIGNED_INT,
        model->attr_n, sizeof(ATTR), &model->attr[0][gl_vertex]) < 0)
        printf("erreur\n");

    // afficher le buffer
    vertex_buffer_draw(buffer);

    // detruire le buffer
    vertex_buffer_delete(buffer);

    // fin du programme
    vertex_buffer_quit();
    sdlkit_quit();


Partie 3 : Mon premier vertex shader

    On souhaite animer un point dont on connait la position de départ et celle d'arrivée. La solution consiste à interpoler la position du point entre sa position de départ et sa position d'arrivé, en fonction du temps.

    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.



    Voici le vertex shader minimal :

// simple.vsl : vertex shader minimal
void main(void)
{
    gl_Position= gl_ModelViewProjectionMatrix * gl_Vertex;
}

    Que faut-il ajouter pour l'utiliser ?

glsl_init()
program= glsl_program_init("simple.vsl", "simple.fsl");
if(program==0)
        return -1;
/* active le programme */
glUseProgram(program);


et glsl_quit() à la fin du programme avant sdlkit_quit().



Annexe : utilitaires

Installation de sdlkit

Téléchargez sdlkit (build 116, mise à jour du 19/01/2009, fonctionne avec les drivers 180.11)

créez un répertoire et dézippez l'archive dedans
cd <répertoire>
tar -zxvf sdlkit_latest.tar.gz
make
make install

si vous souhaitez installer les exemples :
créez un répertoire tests dans le répertoire sdlkit et dézippez l'archive dedans
cd tests
tar -zxvf sdlkit_tests_latest.tar.gz
make

Installation de objtoy

Objtoy est fourni avec sdlkit, dans le répertoire ... objtoy.

tar -zxvf objtoy_latest.tar.gz
make
make install

shadercc

    Pour compiler vos shaders et vérifier qu'il n'y a pas d'erreurs de syntaxe et de casts avant d'éxécuter votre programme complet :

        ~/local/bin/shadercc -c shader.vsl

    Pensez à ajouter #version 110 au début du source des shaders pour détecter le maximum d'erreurs / warnings. shadercc affiche également la ligne du source correspondant à l'erreur détectée par le driver et en utilisant le format d'erreur de gcc, résultat, il s'intègre facilement à un éditeur ...

    Démonstration :

intégration shadercc avec SciTE


Intégration de shadercc dans SciTE

    Ouvrez les propriétés utilisateur : menu 'Options', option 'Open User Options File', copiez - collez les lignes suivantes :

# extensions de fichiers reconnues
file.patterns.cpp=*.c;*.cpp;*.cs;*.h;*.hpp;*.fsl;*.vsl

# compilation des shaders glsl
shadercc=shadercc -c $(FileNameExt)
command.compile.*.vsl=$(shadercc)
command.compile.*.fsl=$(shadercc)

    Enregistrez le fichier, fermez SciTE, rouvrez-le et éditez un shader (utilisez une extension .v?? pour un vertex shader et .f?? pour un fragment shader). Dans le menu Tools, l'option Compile est maintenant disponible (Ctrl-F7). Appuyez ensuite sur F4 pour visualiser les différentes erreurs (éventuelles, bien sur !).