gKit2 light
|
cf tuto2GL.cpp
un shader program est la même chose que d'habitude : le code exécutable crée par l'édition de liens des binaires obtenus après la compilations des shaders.
et comme d'habitude, il peut y avoir des erreurs de compilation et des erreurs d'édition de liens.
la démarche est très classique :
la partie la plus longue est finalement la vérification et la récupération des erreurs, sans grande surprise...
rappel : les objets openGL sont manipulés à travers des identifiants numériques, openGL définit le type GLuint spécialement pour ça. vous pouvez repasser dans interface C openGL, si nécessaire.
le plus simple en C++, renvoie une chaine de caractères std::string :
il faut ensuite préparer les sources à compiler. la fonction glShaderSource() veut un tableau de chaines de caracteres. il faut donc le construire.
puis compiler le shader :
un objet shader openGL maintient un état de compilation ainsi que les messages d'erreurs (et sonsource également). il suffit de l'interroger avec glGetShader( ) :
si la compilation à échoué, il faut récupérer et afficher les messages, cf glGetShaderInfoLog( ). comme on ne connait pas a priori la longueur des messages, il faut la demander, allouer une chaine de caractères de la bonne taille et enfin récupérer les messsages...
si tout c'est bien passé pour le premier shader, on peut passer au 2ieme, seul le type de shader change : ce sera GL_FRAGMENT_SHADER au lieu de GL_VERTEX_SHADER.
la démarche est la même que pour les shaders, il faut indiquer au program quels shaders linker ensemble avec glAttachShader( ), puis vérifier les erreurs,
et éventuellement récupérer et afficher les erreurs...
voila, rien de bien compliqué, mais c'est un peu long.
un exemple minimaliste est dispo tuto2GL.cpp
une fois que le program est correctement compilé et linké, avant de dessiner avec glDraw( ), il faut donner une valeur à tous ses uniforms et associer un buffer à ses attributs cf afficher plusieurs triangles, modifier les paramètres uniform d'un shader program et configurer un format de sommet, vertex array object. il est aussi possible, pour vérifier que l'on a rien oublié, de demander au shader program quels sont les uniforms déclarés, leur nom, leur type, leur valeur, etc. pour vérifier que l'initialisation est correcte. cf récupérer les uniforms et les attributs utilisés par un shader program.
par contre les messages d'erreurs sont très succints et n'affichent qu'un numéro de ligne sans aucun contexte, ce qui est assez pénible pour corriger l'erreur.
exemple: la compilation du shader suivant, qui comporte une erreur :
renvoie les erreurs :
ce qui n'est pas vraiment utilisable...
program.h fournit une fonction utilitaire qui analyse le message d'erreur, retrouve les numéros de lignes sur lesquels se sont produit les erreurs, et les insère dans le source du shader :
ce qui donne :
vous pouvez compiler les shaders comme vous voulez et utiliser uniquement program_print_errors() ou program_format_errors().
pour les curieux : le source est dispo program.cpp, fonctions print_line( ) et print_errors( ).
program.h fournit une fonction permettant de compiler plusieurs shaders écrits dans le même fichier, cf read_program( ).
les shaders sont compilés séparement en utilisant le pré processeur, avec #ifdef VERTEX_SHADER, #ifdef FRAGMENT_SHADER, etc. un fichier .glsl ressemble à ça :
autre solution, shader_kit.cpp peut être utilisé comme compilateur de shader, il affiche les erreurs sous cette forme un peu plus lisible, et permet de recharger et de recompiler le shader en appuyant sur la touche R. ça permet de corriger interactivement le source du shader en le modifiant dans un éditeur.
shader_kit est un 'bac à sable' permettant d'écrire et de tester des shaders assez facilement. il permet aussi de charger un objet .obj, des textures et permet de déplacer la camera à la souris.
comme il n'est pas possible d'écrire une solution totalement générique, shader_kit à des limites :
il définit également les valeurs de plusieurs uniforms :
malgré ces limites, on peut écrire des choses interressantes :
cf tuto2GL.cpp