compilez shader_kit pour tester vos shaders.
comme abordé en cours, un shader est une fonction très classique,
sa seule particularité est de s'exécuter (en parallèle) sur les
processeurs de la carte graphique.
ses paramètres lui sont transmis en suivant une convention
particulière, ce sont des variables globales (déja déclarées)
testez ce shader avec shader_kit// fragment shader
// in int gl_PrimitiveID; // (entree) indice du triangle
// in vec4 gl_FragCoord; // (entree) coordonnees du fragment dans l'espace image
// in bool gl_FrontFacing; // (entree) orientation du triangle
out vec4 fragment_color; // (resultat obligatoire) couleur du fragment
void main( )
{
fragment_color= vec4(1, 1, 1, 1);
}
le vertex shader est utilisé 3 fois, pour transformer / produire les coordonnées des 3 sommets d'un triangle. chaque appel de la fonction / du vertex shader, doit produire les coordonnées du sommet d'indice gl_VertexID (qui varie de 0 a 2 inclu). Ces coordonnées sont simplement stockées dans le tableau// in int gl_VertexID // (entree) indice du sommet
// out vec4 gl_Position; // (resultat obligatoire) coordonnees (transformees) du ieme sommet de l'objet
void main( )
{
vec2 positions[3]= vec2[3]( vec2(-1,-3), vec2(3, 1), vec2(-1, 1) );
gl_Position= vec4(positions[gl_VertexID], 0, 1);
}
positions[]
. float distance( vec2 a, vec 2 b );
uniform
vec2 viewport
;uniform vec3
mouse;
)data/bigguy.obj
ou data/robot.obj
par exemple, que faut-il modifier pour afficher un objet (composé de
plusieurs triangles...) ?bin/shader_kit shader.glsl data/bigguy.obj
Avant de modifier votre application pour utiliser des shaders, il est plus simple de les écrire et de les tester avec shader_kit. Mais il faut respecter 3 conventions :
layout(location=
xxx)
, rappel: les paramètres fournis par shader_kit sont
décrits sur cette
page...
#version 330
#ifdef VERTEX_SHADER
layout(location= 0) in vec3 position;
//!! attention layout(location= 0) obligatoire pour shader_kit et Mesh !!
uniform mat4 mvpMatrix; //!! attention mat4 mvpMatrix obligatoire pour shader_kit !!
void main( )
{
gl_Position= mvpMatrix * vec4(position, 1);
}
#endif
#ifdef FRAGMENT_SHADER
out vec4 fragment_color;
void main( )
{
fragment_color= vec4(1, 0.6, 0, 1);
}
#endif
Une fois que les shaders fonctionnent dans shader_kit, que
faut-il faire pour les utiliser dans l'application ? cf tuto9
(et éventuellement tuto10
pour utiliser directement openGL...)
Modifiez votre application tube pour décorer les tubes calculés
dans le tp précédent. par exemple, en fonction de la position
par rapport à la courbe, son abscisse entre le premier point et
le dernier calculé.