dmothes
Messages postés56Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention11 novembre 2005
-
6 mai 2004 à 07:48
dmothes
Messages postés56Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention11 novembre 2005
-
5 juil. 2004 à 10:33
quelqu'un pourrait-il m'expliquer comment faire du calcul d'ombre un OpenGL, ou me donner un lien vers un site (en français) qui l'explique.
lolquivole
Messages postés11Date d'inscriptiondimanche 13 juillet 2003StatutMembreDernière intervention20 juillet 2005 4 juil. 2004 à 01:29
L'ombre, c'est la projection de tout un objet sur un plan suivant la direction de la lumière.
C'est donc pour ca qu'il faut multiplier la matrice modelview par une matrice de projection (projection sur le plan // à la lumière).
Il ne faut pas dessiner l'objet tel quel dans ce plan: il faut la dessiner noire et un peu transparente, pour que ca ressemble à une ombre :)
Par contre il ne faut pas assombrir deux fois le même point : c'est là que le stencil buffer intervient :
Il faut donc incrémenter le stencil quand stencil test et depth test passent.
Si l'objet est au départ transparent, il ne faut pas utiliser cette technique: il y a un assombrissement proportionnel au nombre de surfaces.
Pour obtenir la matrice de projection: d'après la doc. de M.J. Kilgard :
/* Create a matrix that will project the desired shadow. */
enum { X = 0, Y, Z, W };
void shadowMatrix(GLfloat shadowMat[4][4], GLfloat groundplane[4], GLfloat lightpos[4])
{
GLfloat dot;
avec shadowMat la matrice à construire, groundpane l’équation du plan où projeter l’ombre (de type ax + by + cz + d = 0), et lightpos comme son nom l’indique (lightpos[3] de préférence à 0).
Et pour les coefficients du plan :
/* Find the plane equation given 3 points. */
enum { A = 0, B, C, D };
void findPlane(GLfloat plane[4], GLfloat v0[3], GLfloat v1[3], GLfloat v2[3])
{
GLfloat vec0[3], vec1[3];
-Calcul de la matrice de projection (avec vfloor des points de la surface) :
GLfloat floorPlane[4];
GLfloat floorShadow[4][4];
findPlane(floorPlane, vfloor[1], vfloor[2], vfloor[3]);
shadowMatrix(floorShadow, floorPlane, lightZeroPosition);
-On change les paramètres pour dessiner une surface noire transparente :