cet article en parle, mais c'est un peu trop complexe pour mon niveau de maîtrise actuel

J'ai pensé à une autre approche, je dessine deux fois ma figure avec des vecteurs normaux pour chaque sommet. Une première fois les faces avant avec un Cel Shading,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
// Vertex
varying float N;
void main() {
 N=dot(vec3(0,0,1),normalize(gl_NormalMatrix*gl_Normal)); // calcul au sommet
 gl_Position=ftransform();
 gl_FrontColor=gl_Color;
}
 
// Fragment
varying float N; // N est Interpolé en passant du VertexShader au FragmentShader !
void main() {
 float I=N;
 if (I<0.05) I=0.5;    // seuillage
 else if (I<0.25) I=0.75;
 else I=1;
 gl_FragColor=gl_Color*vec4(I,I,I,1);
}
la seconde fois avec un autre Shader qui ajoute aux sommets leur vecteur normal.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
void main {
 vec4 pos=ftransform();
 vec3 N=gl_NormalMatrix*glNormal;
 pos.xy+=N.xy;
 gl_Position=pos;
 gl_FrontColor=cl_Color;
}
il serait préférable de modifier le point 3D avant transformation, mais j'ai pas trouvé comment on fait

EDIT: facile
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
void main() {
 gl_Vertex.xyz+=gl_Normal;
 gl_Position=ftransform();
 gl_FrontColor=cl_Color;
}
Nom : Shader.png
Affichages : 71
Taille : 3,0 Ko

EDIT2:

et ne serait-il pas possible de faire tout cela en une seule fois ? si la face est arrière on ajoute la normale et on dessine en noir, si elle est avant, on applique le CelShading ?!