[OpenGL] Problème de création d'une shadowMap

Le côté programmation du développement d'un jeu vidéo.

Problème de création d'une shadowMap

Messagepar wishtchoco » 18 Juil 2008, 11:52

Salut à tous, je me sert pas mal de vos p'tit conseils pour me débloquer dans mes codes.....et là, je sèche complet!! :00000006:

J'essai de générer l'ombre d'un objet en utilisant le principe du shadow mapping. Lorsque je veux voir la shadowmap (en principe, ce que je vois du point de vu de la lumière) ... je me retrouve avec un belle écran blanc: comme si les bornes near et far de mon gluPerspective n'étaient pas bonnes. Pourtant elles me semblent correctement réglées.....:00000005:

Je penche plus pour un problème de matrice (MODELVIEW, PROJECTION)...mais elles restent très obscures pour moi...

En effet, lorsque je sélectionne la matrice MODELVIEW au lieu de PROJECTION, et PROJECTION à la place de MODELVIEW dans ma fonction generateShadowMap() j'obtiens l'image recherchée mais elle ne m'affiche pas le deuxième objet qui est un peu plus loin dans la scène....JE SUIS PAUME

Voilà des bouts de codes:

main.c :
Code: Tout sélectionner
/*déclaration des variables globales*/
GLdouble spin=0,theta=70, norme=13;
GLfloat light_position[4]= {5, 0, 5, 0};
GLfloat nearPlane = 1, farPlane=100;


void my_display (void)
{     
      generateShadowMap();
      //generateTextureMatrix();   /*ce sera la prochaine étape...mais c'est pas pour tout de suite !*/
      if ( showShadow ) return;
 
      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |GL_ACCUM_BUFFER_BIT);
      glClearColor (1, 1, 1, 1);

      glMatrixMode (GL_PROJECTION);
      glLoadIdentity ();

      gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.1,background_radius + 8);


      glPushMatrix();
      gluLookAt (norme*(sin(theta))*(cos(spin)),norme*(sin(theta))*(sin(spin)),norme*cos(theta), 0.1,0,0, 0,0,1);
     
      renderScene (GL_FALSE);      
      glPopMatrix();


      glutSwapBuffers ();
      glFlush ();

}


int main (int argc, char **argv)
{
  glutInit (&argc, argv);
  glutInitWindowPosition (600, 400);
  glutInitWindowSize (screen_width, screen_height);
  glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH | GLUT_ACCUM | GLUT_DOUBLE);

  glutCreateWindow ("Simulation d'ombres");

  glutDisplayFunc (my_display);
  glutKeyboardFunc (my_keyboard);
  glutSpecialFunc (my_special);
 
  glDisable (GL_NORMALIZE);
  glEnable (GL_DEPTH_TEST);
  glEnable (GL_TEXTURE_2D);
  glEnable (GL_BLEND);
  glShadeModel(GL_SMOOTH);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  glPixelStorei(GL_UNPACK_LSB_FIRST,0);

  glLightfv (GL_LIGHT1, GL_POSITION, light_position);
  glLightfv (GL_LIGHT1, GL_SPECULAR, light_color_specular);
  glLightfv (GL_LIGHT1, GL_DIFFUSE, light_color_diffuse);
  glLightfv (GL_LIGHT1, GL_AMBIENT, light_color_ambient);

  initBottom ();
  initObjet3DS_1();
  initObjet3DS_2 ();
  initBackground ();

  glutMainLoop ();


  return EXIT_SUCCESS;

}


rendu.c :
Code: Tout sélectionner
void initBottom ()
{
  /*ouverture de la carte d'élévation, et je l'applique entant que texture*/
}


void initObjet3DS_1()
{
  /*j'ouvre un fichier 3DS et je le place dans une liste*/
}

void initObjet3DS_2()
{
  /*j'ouvre un fichier 3DS et je le place dans une liste*/
}




void generateShadowMap()
{
    GLint    viewport[4];
    GLfloat  lightPos[4];

     glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
          SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0,
        GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL );



    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL );
    glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE );

    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );

    glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );

    glCullFace( GL_BACK );

    glEnable( GL_DEPTH_TEST );
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHT1 );

    glEnable( GL_TEXTURE_2D );

    glEnable( GL_TEXTURE_GEN_S );
    glEnable( GL_TEXTURE_GEN_T );
    glEnable( GL_TEXTURE_GEN_R );
    glEnable( GL_TEXTURE_GEN_Q );
    glEnable( GL_COLOR_MATERIAL );
    glEnable( GL_CULL_FACE );



    glGetLightfv( GL_LIGHT1, GL_POSITION, lightPos );
    glGetIntegerv( GL_VIEWPORT, viewport );

    glViewport( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT );

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    //glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glPushMatrix();
    glLoadIdentity();
    gluPerspective (40, 1.0, nearPlane,farPlane);
    glMatrixMode( GL_MODELVIEW );
    //glMatrixMode( GL_PROJECTION );

    glPushMatrix();
    glLoadIdentity();
    /*je me place du point de vu de la lumière*/
    gluLookAt( lightPos[0], lightPos[1], lightPos[2],
          lookat[0], lookat[1], lookat[2],
          up[0], up[1], up[2] );

    /*j'exécute la scène*/
    renderScene( GL_TRUE );

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    //glMatrixMode( GL_MODELVIEW );
    glPopMatrix();
    glMatrixMode( GL_MODELVIEW );
    //glMatrixMode(GL_PROJECTION);

    glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0,
            SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0 );

    glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );

    if ( showShadow ) {
      GLfloat depthImage[SHADOW_MAP_WIDTH][SHADOW_MAP_HEIGHT];
      glReadPixels( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT,
          GL_DEPTH_COMPONENT, GL_FLOAT, depthImage );

      glDrawPixels( SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, GL_LUMINANCE,
          GL_FLOAT, depthImage );
      glutSwapBuffers();
    }
    glDisable( GL_TEXTURE_GEN_S );
    glDisable( GL_TEXTURE_GEN_T );
    glDisable( GL_TEXTURE_GEN_R );
    glDisable( GL_TEXTURE_GEN_Q );
    glDisable( GL_COLOR_MATERIAL );


}



void renderScene (GLboolean shadowRender)
{
  GLboolean textureOn = glIsEnabled (GL_TEXTURE_2D);

  glMatrixMode (GL_MODELVIEW);
  glLoadIdentity();
  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);


  glEnable (GL_LIGHTING);
  glEnable (GL_LIGHT1);
  glEnable (GL_DEPTH_TEST);
  glShadeModel (GL_SMOOTH);

  glEnable( GL_TEXTURE_2D );

  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable (GL_NORMALIZE);

 

  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, bottom_specular);
  glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, bottom_diffuse);
  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, bottom_ambient);
  glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, bottom_shininess);
   
    if(shadowRender)
       glDisable (GL_TEXTURE_2D);
   
    if(!shadowRender)
       drawBottomList ();


  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, object_specular2);
  glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, object_diffuse2);
  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, object_ambient2);
  glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, object_shininess2);

  glPushMatrix ();
  glLoadIdentity ();
  glTranslatef (light_position[0], light_position[1], light_position[2]);
  glCallList (g_list_Objet3DS_2);
  glPopMatrix ();



  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, object_specular);
  glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, object_diffuse);
  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, object_ambient);
  glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, object_shininess);

  glPushMatrix ();
  glLoadIdentity ();
  glTranslatef (object_translation[0], object_translation[1], object_translation[2]);
  glRotatef (object_rotation[0], object_rotation[1], object_rotation[2], object_rotation[3]);
  glCallList (g_list_Objet3DS_1);
  glPopMatrix ();



  if(shadowRender && textureOn)
     glEnable(GL_TEXTURE_2D);


}
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 18 Juil 2008, 15:10

:00000017: Personne pour me donner une piste?Là j'ai plus d'idée
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 18 Juil 2008, 15:48

Yo man !
Ça serait pas mal si tu me filais ton code que je jette un oeil directement :-)
Dans un 1er temps, tente de bien mettre en place les matrices que tu souhaites contrôler.
Plus précisément :
Code: Tout sélectionner
 void my_display (void)
{     
      generateShadowMap();
      //generateTextureMatrix();   /*ce sera la prochaine étape...mais c'est pas pour tout de suite !*/
      if ( showShadow ) return;
 
      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |GL_ACCUM_BUFFER_BIT);
      glClearColor (1, 1, 1, 1);

      glMatrixMode (GL_PROJECTION);

       glPushMatrix();

      glLoadIdentity ();

      gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.1,background_radius + 8);

     
       glMatrixMode (GL_MODELVIEW);
       glPushMatrix();
       glLoadIdentity();

      gluLookAt (norme*(sin(theta))*(cos(spin)),norme*(sin(theta))*(sin(spin)),norme*cos(theta), 0.1,0,0, 0,0,1);
     
      renderScene (GL_FALSE);

       glMatrixMode (GL_PROJECTION);
       glPopMatrix();

       glMatrixMode (GL_MODELVIEW);
       glPopMatrix();

      glutSwapBuffers ();
      glFlush ();
}
Tente déjà ça et dit moi ce que ca donne :-)

YoYo
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 18 Juil 2008, 16:08

Merci de me filer un coup de main !!!
la solitude me gagnait devant mon clavier:00000020:

Je viens de rajouter les quelques lignes de codes...mais en vain!

Après avoir rajouter ca, mes objets 3DS disparaisse de l'écran
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 18 Juil 2008, 16:17

yoyonel a écrit:

Code: Tout sélectionner
 void my_display (void)
{     
      generateShadowMap();
      //generateTextureMatrix();   /*ce sera la prochaine étape...mais c'est pas pour tout de suite !*/
      if ( showShadow ) return;
 
      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |GL_ACCUM_BUFFER_BIT);
      glClearColor (1, 1, 1, 1);

      glMatrixMode (GL_PROJECTION);

       glPushMatrix();

      glLoadIdentity ();

      gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.1,background_radius + 8);

     
       glMatrixMode (GL_MODELVIEW);
       glPushMatrix();
       glLoadIdentity();

      gluLookAt (norme*(sin(theta))*(cos(spin)),norme*(sin(theta))*(sin(spin)),norme*cos(theta), 0.1,0,0, 0,0,1);
     
      renderScene (GL_FALSE);

       glMatrixMode (GL_PROJECTION);
       glPopMatrix();

       glMatrixMode (GL_MODELVIEW);
       glPopMatrix();

      glutSwapBuffers ();
      glFlush ();
}



En fait dès que je réinitialise la matrice modelview...j'ai les objets 3DS qui se barre
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 18 Juil 2008, 16:29

C'est bon pour les objet 3DS, je les ai de retour.
Dans mon rendu.c, avant de placer mes objets, je reinitialisais ma matrice courante par un identity...

Maintenant, ma shadow map réagit bien en fonction des paramètres near et far de mon gluPerspective !!!

C'est déjà bien!

Me reste plus qu'à bien le régler......

Comment tu procèdes pour ce type de réglage?
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 18 Juil 2008, 17:27

Je constate que j'ai un bug sur la shadowMap

Cf. l'image.

En effet j'ai un contour de la shadowMap....et je m'attend à ce que ca m.....
Fichiers joints
image1.JPG
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar yoyonel » 18 Juil 2008, 20:17

Faudrait que je vois le code que t'as pour tes méthodes generateShadowMap() et generateTextureMatrix().

Vérifie que ton viewport est bien réglé par rapport à la taille de surface de rendu pour la shadow map (glViewport(...)).

YoYo

ps : le code que je t'ai filé est incorrecte, il faut pas intervertir le push/pop de modelview et projection sinon ya mélimélo :p

Code: Tout sélectionner
 // Mise en place de la matrice de vue (Point de vue Lumière)
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
gluLookat(...);

// Mise en place de la matrice de projection associé à la caméra de visualisation point de vue lumière
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerspective(...);

// rendu de la scène en lightview
renderSceneForShadowMap(...);

glPopMatrix(); // tu pop la matrice de projection

glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // tu pop la matrice de vue (celle de la caméra de scène a priori ... mais pas obligé ca dépend de ton code avant)

// fini :-D
Avatar de l’utilisateur
yoyonel
Hello World, I'm new !
 
Messages: 105
Inscription: 12 Avr 2005, 21:25
Localisation: Lyon

Messagepar wishtchoco » 21 Juil 2008, 09:41

Salut yoyonel!

J'ai essayé ta modif sur l'ordre des appels avant le rendu de la scène, et je perd un objet 3DS lorsque j'observe en mode shadowMap.

Je me suis "grandement" inspiré des exemples du redbook pour les fonctions generateShadowMap() et generateTextureMatrix().


generateShadowMap():

Code: Tout sélectionner
void generateShadowMap( void )
{
    GLint    viewport[4];
    GLfloat  lightPos[4];

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL );
    glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE );

    glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
    glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );

    glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );

    glCullFace( GL_BACK );

    glEnable( GL_DEPTH_TEST );
    glEnable( GL_LIGHT0 );
    glEnable( GL_LIGHTING );
    glDisable( GL_TEXTURE_2D );
    glEnable( GL_TEXTURE_GEN_S );
    glEnable( GL_TEXTURE_GEN_T );
    glEnable( GL_TEXTURE_GEN_R );
    glEnable( GL_TEXTURE_GEN_Q );
    glEnable( GL_COLOR_MATERIAL );

    glEnable( GL_CULL_FACE );

     glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
          SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0,
        GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL );


    glGetLightfv( GL_LIGHT1, GL_POSITION, lightPos );
    glGetIntegerv( GL_VIEWPORT, viewport );

    glViewport( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT );

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


    glMatrixMode( GL_PROJECTION );
    glPushMatrix();
    glLoadIdentity();
    gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, nearPlane,farPlane);

    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
    glLoadIdentity();
    gluLookAt( lightPos[0], lightPos[1], lightPos[2],
          lookat[0], lookat[1], lookat[2],
          up[0], up[1], up[2] );


    renderScene( GL_TRUE );

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode( GL_MODELVIEW );

    glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0,
            SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0 );

    glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );

    if ( showShadow ) {
      GLfloat depthImage[SHADOW_MAP_WIDTH][SHADOW_MAP_HEIGHT];
      glReadPixels( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT,
          GL_DEPTH_COMPONENT, GL_FLOAT, depthImage );

      glDrawPixels( SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, GL_LUMINANCE,
          GL_FLOAT, depthImage );
      glutSwapBuffers();
    }
    glDisable( GL_TEXTURE_GEN_S );
    glDisable( GL_TEXTURE_GEN_T );
    glDisable( GL_TEXTURE_GEN_R );
    glDisable( GL_TEXTURE_GEN_Q );
    glDisable( GL_COLOR_MATERIAL );


}


generateTexture:
Code: Tout sélectionner
void generateTextureMatrix( void )
{
    GLfloat  tmpMatrix[16];

    glEnable( GL_TEXTURE_GEN_S );
    glEnable( GL_TEXTURE_GEN_T );
    glEnable( GL_TEXTURE_GEN_R );
    glEnable( GL_TEXTURE_GEN_Q );
    glEnable( GL_COLOR_MATERIAL );
    /*
     *  Set up projective texture matrix.  We use the GL_MODELVIEW matrix
     *    stack and OpenGL matrix commands to make the matrix.
     */
    glPushMatrix();
    glLoadIdentity();
    glTranslatef( 0.5, 0.5, 0.0 ); /*je dois les modifier*/
    glScalef( 0.5, 0.5, 1.0 );     /*je dois les modifier*/
    gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.1,background_radius + 8);
    gluLookAt( light_position[0], light_position[1], light_position[2],
          lookat[0], lookat[1], lookat[2],
          up[0], up[1], up[2] );
    glGetFloatv( GL_MODELVIEW_MATRIX, tmpMatrix );
    glPopMatrix();

    transposeMatrix( tmpMatrix );

    glTexGenfv( GL_S, GL_OBJECT_PLANE, &tmpMatrix[0] );
    glTexGenfv( GL_T, GL_OBJECT_PLANE, &tmpMatrix[4] );
    glTexGenfv( GL_R, GL_OBJECT_PLANE, &tmpMatrix[8] );
    glTexGenfv( GL_Q, GL_OBJECT_PLANE, &tmpMatrix[12] );
   
    glDisable( GL_TEXTURE_GEN_S );
    glDisable( GL_TEXTURE_GEN_T );
    glDisable( GL_TEXTURE_GEN_R );
    glDisable( GL_TEXTURE_GEN_Q );
    glDisable( GL_COLOR_MATERIAL );

}
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 21 Juil 2008, 14:05

Pb réglé, je décide finalement de ne pas traiter le sol dans mon shadowMapping...comme ca plus de bordures !!

Me reste à appliquer le multitexturage sur mon sol de manière à ce que l'objet 3DS me projette (enfin!) une ombre! ^^:00000020:
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27

Messagepar wishtchoco » 22 Juil 2008, 16:39

yoyonel a écrit:Faudrait que je vois le code que t'as pour tes méthodes generateShadowMap() et generateTextureMatrix().

Vérifie que ton viewport est bien réglé par rapport à la taille de surface de rendu pour la shadow map (glViewport(...)).

YoYo

ps : le code que je t'ai filé est incorrecte, il faut pas intervertir le push/pop de modelview et projection sinon ya mélimélo :p

Code: Tout sélectionner
 // Mise en place de la matrice de vue (Point de vue Lumière)
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
gluLookat(...);

// Mise en place de la matrice de projection associé à la caméra de visualisation point de vue lumière
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPerspective(...);

// rendu de la scène en lightview
renderSceneForShadowMap(...);

glPopMatrix(); // tu pop la matrice de projection

glMatrixMode(GL_MODELVIEW);
glPopMatrix(); // tu pop la matrice de vue (celle de la caméra de scène a priori ... mais pas obligé ca dépend de ton code avant)

// fini :-D


Salut

je voulais votre avis pour toujours le meme problème......:00000010:

Comment arriver à appliquer comme texture ma shadow map.

Voici des bouts de codes:


renderScene.c:

Code: Tout sélectionner
void
renderScene (GLboolean shadowRender)
{
  GLboolean textureOn = glIsEnabled (GL_TEXTURE_2D);
  glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);

  /* Set the shading model */
  glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);


  glEnable (GL_LIGHTING);
  glEnable (GL_LIGHT1);
  glEnable (GL_DEPTH_TEST);


  /*******************************************************
   * Shading model
   *******************************************************/
  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable (GL_NORMALIZE);

  /*******************************************************
   * Drawing
   *******************************************************/
    if(shadowRender)
    {
      glDisable (GL_TEXTURE_2D);
    }

    if(!shadowRender)
    {


       glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,
          SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0,
        GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL );

       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL );
       glTexParameteri( GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE );
       glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE );

       glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
       glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
       glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
       glTexGeni( GL_Q, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );

       glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );

       glCullFace( GL_BACK );
       glEnable (GL_TEXTURE_2D);
       glEnable( GL_TEXTURE_GEN_S );
       glEnable( GL_TEXTURE_GEN_T );
       glEnable( GL_TEXTURE_GEN_R );
       glEnable( GL_TEXTURE_GEN_Q );
       glEnable( GL_COLOR_MATERIAL );
       glEnable( GL_CULL_FACE );

       //glDisable(GL_TEXTURE_2D);   /*je suis obligé de commenter ca pour afficher mon sol blanc*/
       glNormal3f(0,0,1);
       glColor3f(0,1,0);
       glRectf(-25,-25,25,25);
       glDisable( GL_COLOR_MATERIAL );
       glDisable(GL_TEXTURE_2D);

    }


  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, object_specular2);
  glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, object_diffuse2);
  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, object_ambient2);
  glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, object_shininess2);

  glPushMatrix ();
  glTranslatef (light_sea1_position[0], light_sea1_position[1], light_sea1_position[2]);
  glRotatef (object_rotation2[0], object_rotation2[1], object_rotation2[2], object_rotation2[3]);
  glCallList (g_list_1);
  glPopMatrix ();


  /* mine */
  glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, object_specular);
  glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, object_diffuse);
  glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, object_ambient);
  glMaterialfv (GL_FRONT_AND_BACK, GL_SHININESS, object_shininess);

  glPushMatrix ();
  glTranslatef (object_translation[0], object_translation[1], object_translation[2]);
  glRotatef (object_rotation[0], object_rotation[1], object_rotation[2], object_rotation[3]);
  glColor3f(1,0,0);
  glEnable( GL_COLOR_MATERIAL);
  glCallList (g_list_2);
  glDisable( GL_COLOR_MATERIAL);
  glPopMatrix ();
 
 
  glPushMatrix ();
  glTranslatef (object_translation3[0], object_translation3[1], object_translation3[2]);
  glRotatef (object_rotation[0], object_rotation[1], object_rotation[2], object_rotation[3]);
  glColor3f(1,0,0);
  glEnable( GL_COLOR_MATERIAL);
  glCallList (g_list_3);
  glDisable( GL_COLOR_MATERIAL);
  glPopMatrix ();
 
  glPushMatrix ();
  glTranslatef (object_translation4[0], object_translation4[1], object_translation4[2]);
  glRotatef (object_rotation[0], object_rotation[1], object_rotation[2], object_rotation[3]);
  glColor3f(1,0,0);
  glEnable( GL_COLOR_MATERIAL);
  glCallList (g_list_4);
  glDisable( GL_COLOR_MATERIAL);
  glPopMatrix ();


  if(shadowRender && textureOn)
     glEnable(GL_TEXTURE_2D);

  /* text */
  drawText ();

}



generateShadowMap.c :

Code: Tout sélectionner
void generateShadowMap( void )
{
    GLint    viewport[4];
    GLfloat  lightPos[4];


    glGetLightfv( GL_LIGHT1, GL_POSITION, lightPos );
    glGetIntegerv( GL_VIEWPORT, viewport );

    glViewport(0 , 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT );

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


    glMatrixMode( GL_PROJECTION );
    glPushMatrix();
    glLoadIdentity();
    gluPerspective (40, (GLfloat) screen_width / (GLfloat) screen_height, nearPlane,farPlane);
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
    glLoadIdentity();
    gluLookAt( lightPos[0], lightPos[1], lightPos[2],
          lookat[0], lookat[1], lookat[2],
          up[0], up[1], up[2] );


    renderScene( GL_TRUE );

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode( GL_MODELVIEW );

    glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0,
            SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, 0 );

    glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );

    if ( showShadow ) {
      GLfloat depthImage[SHADOW_MAP_WIDTH][SHADOW_MAP_HEIGHT];
      glReadPixels( 0, 0, SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT,
          GL_DEPTH_COMPONENT, GL_FLOAT, depthImage );

      glDrawPixels( SHADOW_MAP_WIDTH, SHADOW_MAP_HEIGHT, GL_LUMINANCE,
          GL_FLOAT, depthImage );
      glutSwapBuffers();
    }



}



generateTextureMatrix.c :

Code: Tout sélectionner
void generateTextureMatrix( void )
{
    GLfloat  tmpMatrix[16];

    /*
     *  Set up projective texture matrix.  We use the GL_MODELVIEW matrix
     *    stack and OpenGL matrix commands to make the matrix.
     */

    glPushMatrix();
    glLoadIdentity();
    glTranslatef( 5, 5, 0.0 );  /*????????????????????*/
    glScalef( 0.5, 0.5, 1.0 );
    gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.1,background_radius + 100);
    gluLookAt( light_position[0], light_position[1], light_position[2],
          lookat[0], lookat[1], lookat[2],
          up[0], up[1], up[2] );
    glGetFloatv( GL_MODELVIEW_MATRIX, tmpMatrix );
    glPopMatrix();

    transposeMatrix( tmpMatrix );

    glTexGenfv( GL_S, GL_OBJECT_PLANE, &tmpMatrix[0] );
    glTexGenfv( GL_T, GL_OBJECT_PLANE, &tmpMatrix[4] );
    glTexGenfv( GL_R, GL_OBJECT_PLANE, &tmpMatrix[8] );
    glTexGenfv( GL_Q, GL_OBJECT_PLANE, &tmpMatrix[12] );

}



main.c:

Code: Tout sélectionner
main.c :


/*déclaration des variables globales*/
GLdouble spin=0,theta=70, norme=13;
GLfloat light_position[4]= {5, 0, 5, 0};
GLfloat nearPlane = 1, farPlane=100;


void my_display (void)
{     
      generateShadowMap();
      //generateTextureMatrix();   /*ce sera la prochaine étape...mais c'est pas pour tout de suite !*/
      if ( showShadow ) return;
 
      glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |GL_ACCUM_BUFFER_BIT);
      glClearColor (1, 1, 1, 1);

      glMatrixMode (GL_PROJECTION);
      glLoadIdentity ();

      gluPerspective (CAMERA_ANGLE, (GLfloat) screen_width / (GLfloat) screen_height, 0.1,background_radius + 8);


      glPushMatrix();
      gluLookAt (norme*(sin(theta))*(cos(spin)),norme*(sin(theta))*(sin(spin)),norme*cos(theta), 0.1,0,0, 0,0,1);
     
      renderScene (GL_FALSE);      // no field of depth
      glPopMatrix();


      glutSwapBuffers ();
      glFlush ();

}


int main (int argc, char **argv)
{
  glutInit (&argc, argv);
  glutInitWindowPosition (600, 400);
  glutInitWindowSize (screen_width, screen_height);
  glutInitDisplayMode (GLUT_RGBA | GLUT_DEPTH | GLUT_ACCUM | GLUT_DOUBLE);

  glutCreateWindow ("Simulation ombre");

  glutDisplayFunc (my_display);
  glutKeyboardFunc (my_keyboard);
  glutSpecialFunc (my_special);
 
  glDisable (GL_NORMALIZE);
  glEnable (GL_DEPTH_TEST);
  glEnable (GL_TEXTURE_2D);
  glEnable (GL_BLEND);
  glShadeModel(GL_SMOOTH);
  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  glPixelStorei(GL_UNPACK_LSB_FIRST,0);

  glLightfv (GL_LIGHT1, GL_POSITION, light_position);
  glLightfv (GL_LIGHT1, GL_SPECULAR, light_color_specular);
  glLightfv (GL_LIGHT1, GL_DIFFUSE, light_color_diffuse);
  glLightfv (GL_LIGHT1, GL_AMBIENT, light_color_ambient);

  initObjet3DS_1();
  initObjet3DS_2 ();

  glutMainLoop ();


  return EXIT_SUCCESS;

}

je ne comprends pas le glTranslatef(..) de generateTextureMatrix ...
et si je ne commente pas le glDisable(GL_TEXTURE_2D) lorsque je trace mon plan dans renderScene.c je ne l'affiche plus.
wishtchoco
Hello World, I'm new !
 
Messages: 32
Inscription: 18 Juil 2008, 10:27


Retourner vers Programmation

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron