hg clone https://bitbucket.org/jciehl/gkit2
repertoire/
bin/
local/
linux/
bin/
premake4
include/
GL/
glew.h
lib/
libGLEW
gKit/
./local/linux/bin/premake4 gmake
make shader_kit -j4
./shader_kit shader.glsl -m
fsquad.obj
un fichier .obj est un fichier texte avec une structure tres simple : il est compose d'une ligne par sommet et d'une ligne par face.Remarque : syntaxe des fichiers .glsl de gKit
décrire la position d'un sommet :
v x y z
décrire la normale d'un sommet :
vn x y z
décrire les coordonnées de texture d'un sommet :
vt u v
pour décrire un rectangle, il suffit d'indiquer les indices des positions de ses sommets abcd :
f a b c d
de meme pour un triangle abc :
f a b c
ce qui donne, pour un triangle complet :
v
Ax Ay Az
v Bx By Bz
v Cx Cy Cz
f 1 2 3
tous les shaders du program sont écrits dans le même fichier, le bon shader est compilé en utilisant le pre-processeur :
#version 330
#ifdef VERTEX_SHADER
void main( void )
{
gl_Position= { ....
};
}
#endif
#ifdef FRAGMENT_SHADER
out vec4 fragment_color;
void main( void )
{
fragment_color= { ... };
}
#endif
// GEOMETRY_SHADER, CONTROL_SHADER, EVALUATION_SHADER, COMPUTE_SHADER
les matrices de transformations usuelles sont également définies et accessibles :
// transformations classiques :
uniform mat4 mvpMatrix; // uniform matrice transformation complete : model, view et projection
uniform mat4 mvMatrix; // uniform matrice transformation model * view
uniform mat4 normalMatrix; // uniform matrice transformation model * view pour les normales
// et les autres transformations standards ainsi que leurs inverses :
uniform mat4 modelMatrix;
uniform mat4 modelMatrixInv;
uniform mat4 viewMatrix;
uniform mat4 viewMatrixInv;
uniform mat4 projectionMatrix;
uniform mat4 projectionMatrixInv;
uniform mat4 viewportMatrix;
uniform mat4 viewportMatrixInv;
in vec3 position; // attribut pre declares
in vec3 texcoord;
in vec3 normal;
gl_FragCoord.xyz
pour connaitre la
position du fragment dans le repère image.Utilisez shader_kit pour charger un objet .obj quelconque et
plaquez le damier dessus.
par exemple ./shader_kit damier.glsl -m bigguy.obj
Il faudra également penser à modifier le vertex shader afin de
calculer la projection des sommets de l'objet.
Vous pouvez utiliser les positions des sommets dans le repere local de l'objet, ou dans le repere du monde, ou dans le repere de la camera, ou dans le repere image pour construire le damier (qui deviendra du coup plutot une texture "solide").
quelles sont les différences avec la solution précédente ?
comment le fragment shader peut-il accéder aux positions des
sommets / des fragments ?
Chargez également une (ou plusieurs) texture dans shader_kit et
modifiez l'apparence de l'objet.
./shader_kit shader.glsl -m model.obj -t texture0.png -t
texture1.png ...
il est également possible de charger les textures a posteriori
avec un drag&drop dans le champ textureXXX correspondant,
accessible dans l'interface graphique, panneau 'assets'.
Utilisez une texture avec une paramétrisation polaire (type
latitude-longitude) pour modifier la couleur de l'objet en
fonction de son orientation.
le plus simple est de convertir une direction en angles theta/phi
et d'utiliser directement ces valeurs pour accéder à la texture.