M2PRO - Images
Année 2008-2009
TP 1 - Opérations et Vertex Shaders

(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 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 !).