Un tuto heu je ne sais pas.
En fait le principe c´est de changer la taille des ligne d´opengl ( plus épaisses selon le rendu voulu), et de tracer l´objet 2 fois, une fois normalement avec la couleur, et une fois en mode ligne avec les faces dans le sens CW et non CCW, ainsi tu verra apparaitre ces lignes spécifiques au cellshading.
Aussi pour la premiere passe il faut refaire le calcul de la lumiere manuellement. Donc le truc serait de pouvoir le coder en vertex shader pour optimiser tout ca. Et en fait il faut que tu définisse une table 1D en niveau de gris ( R=G=B), pour définir l´intensité de la lumière, et que tu la place dans une texture_1D. Genre une map de 32x3 suffit bien. Avec cette table tu va pouvoir controler l´effet de ton cell shader.
Avant de dessiner, tu dois bien dir que tu désactive la lumière, et donc tu recalcule manuellement les normales transformées de chaque faces, et finalement tu les utilises ( apres quelle soit bien normalisée [0..1]) comme coordonnées de texture. Donc pour cette passe j´utilise glBegin/End avec 3 textures_coord et 3 vertex. Alors que pour la 2° pass des lignes j´utilise les glarray. Donc je pense qu´en vertex shader ca doit etre faisable en une passe, et en utilisant le calcule des normales par la carte 3d ce qui doit grandement optimiser l´algo.
Sinon je pense que tu dois savoir comment on calcule les normales transformés d´un objet ( par la rotation absolue, et la direction de la lumière).
Mais a mon avis un coup de google et tu trouvera bien. Au pire je peu te file ma class mais je ne c pas trop si tu comprendra étant donné que c´est intégré dans mon moteur.
FireBird.