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,
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
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); }
il serait préférable de modifier le point 3D avant transformation, mais j'ai pas trouvé comment on fait
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; }
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; }
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 ?!
Partager