Ombres & lumières avec Lib GLUT

yannousfly Messages postés 2 Statut Membre -  
yannousfly Messages postés 2 Statut Membre -
Bonjour,
J'ai quelques soucis avec Open GL et les lumières en programmant sous visual C++2005.
Le petit bout de code suivant devrait permettr d'afficher des cercles (types polygonnes), les formes sont affichées mais je ne m'en sors pas avec les ombres et les lumières, il n'y a aucun effet de lumière lorsque je bouge l'objet, aucune frontière entre les objets etc....
Voici le code que j'ai inclus dans une fonction d'affichage qui est appelée à chaque mouvement de souris (géré en modifiant la matrice translation et rotation). Je remercie d'avance ceux qui voudront bien vouloir jeter un coup d'oeil sur le code commentée suivant.
La matrcie est intialisée em mode projection et "modelview"
Salut.
DISPLAY()
{
static BOOL bBusy = FALSE;
if(bBusy)
return;
bBusy = TRUE;
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

//les variables m_tran et m_wangle sont mis à jour ailleurs dans
//le code en fonction des messages windows de la souris
glTranslatef(m_transX, m_transY, -m_fRadius);
glRotatef(m_wAngleXCourant, 1.0f, 0.0f, 0.0f);
glRotatef(m_wAngleYCourant, 0.0f, 1.0f, 0.0f);
glRotatef(m_wAngleZCourant, 0.0f, 0.0f, 1.0f);

glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);

//paramètrage de la lumière rayonnée
GLfloat em[] = {1,1,1,1};//spot blanc
GLfloat amb[] = {0.5,0.5,0.5,1.0};//lumière ambiante
GLfloat dif[] = {1,1,1,1.0};
GLfloat spe[] = {0,0,0,1.0};//pas de spéculaire
GLfloat pos[] = {0,0,-1,0.0};//position du spot lumineux en (0,0,-1)

//paramètrage des matériaux et réponse à la lumière
static float diffuse6[4] = { 0.5,0,0,0.5 };
static float ambiant6[4] = { 0.5,0,0,0.5 };
static float specular6[4] = { 0.5,0,0,0.5 };
static float emission6[4] = { 0.5,0.5,0.5,0.5 };
static float shininess6[1] = { 100 };

glEnable(GL_LIGHTING);//active les lumières
glEnable(GL_LIGHT0);
//initialisation des sources lumineuses
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif) ;
glLightfv(GL_LIGHT0, GL_SPECULAR, spe) ;
glLightfv(GL_LIGHT0, GL_AMBIENT, amb) ;
//initialisation des matériaux
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse6);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambiant6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular6);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shininess6);

glEnable(GL_NORMALIZE);
//exemple : dessine 10 cercles parallèles régulièrement espacés suivant la direction Z
// les cercles sont des polygones constitués d'une centaines de sommets
for(int i=0;i<10;i++)//boucle sur les cercles parallèles
{
glBegin(GL_POLYGON);//GL_LINE_STRIP);
glNormal3f(0.0,0.0,1.0);//la normale à chaque polygone est suivant Z
for(int j=0;j<TabNbPoints[i];j++)//TabNbPoints contient le nbre de sommets du polygone
{ //m_fx m_fy m_fz contiennent les valeurs x, y et z des sommets dans l'espace
GLfloat x=(GLfloat)(m_fx[i][j]/500.0);
GLfloat y=(GLfloat)(m_fy[i][j]/500.0);
GLfloat z=(GLfloat)(m_fz[i][j]/500.0);
glVertex3f(x,y,z);//dessine le sommet
}
glEnd();
}
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
bBusy = FALSE;
}

1 réponse

yannousfly Messages postés 2 Statut Membre
 
Bonjour,
J'ai quelques soucis avec Open GL et les lumières en programmant sous visual C++2005.
Le petit bout de code suivant devrait permettr d'afficher des cercles (types polygonnes), les formes sont affichées mais je ne m'en sors pas avec les ombres et les lumières, il n'y a aucun effet de lumière lorsque je bouge l'objet, aucune frontière entre les objets etc....
Voici le code que j'ai inclus dans une fonction d'affichage qui est appelée à chaque mouvement de souris (géré en modifiant la matrice translation et rotation). Je remercie d'avance ceux qui voudront bien vouloir jeter un coup d'oeil sur le code commentée suivant.
La matrcie est intialisée em mode projection et "modelview"
Salut.
DISPLAY()
{
static BOOL bBusy = FALSE;
if(bBusy)
return;
bBusy = TRUE;
//glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();

//les variables m_tran et m_wangle sont mis à jour ailleurs dans
//le code en fonction des messages windows de la souris
glTranslatef(m_transX, m_transY, -m_fRadius);
glRotatef(m_wAngleXCourant, 1.0f, 0.0f, 0.0f);
glRotatef(m_wAngleYCourant, 0.0f, 1.0f, 0.0f);
glRotatef(m_wAngleZCourant, 0.0f, 0.0f, 1.0f);

glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_DEPTH_TEST);

//paramètrage de la lumière rayonnée
GLfloat em[] = {1,1,1,1};//spot blanc
GLfloat amb[] = {0.5,0.5,0.5,1.0};//lumière ambiante
GLfloat dif[] = {1,1,1,1.0};
GLfloat spe[] = {0,0,0,1.0};//pas de spéculaire
GLfloat pos[] = {0,0,-1,0.0};//position du spot lumineux en (0,0,-1)

//paramètrage des matériaux et réponse à la lumière
static float diffuse6[4] = { 0.5,0,0,0.5 };
static float ambiant6[4] = { 0.5,0,0,0.5 };
static float specular6[4] = { 0.5,0,0,0.5 };
static float emission6[4] = { 0.5,0.5,0.5,0.5 };
static float shininess6[1] = { 100 };

glEnable(GL_LIGHTING);//active les lumières
glEnable(GL_LIGHT0);
//initialisation des sources lumineuses
glLightfv(GL_LIGHT0,GL_POSITION,pos);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif) ;
glLightfv(GL_LIGHT0, GL_SPECULAR, spe) ;
glLightfv(GL_LIGHT0, GL_AMBIENT, amb) ;
//initialisation des matériaux
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse6);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambiant6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular6);
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emission6);
glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,shininess6);

glEnable(GL_NORMALIZE);
//exemple : dessine 10 cercles parallèles régulièrement espacés suivant la direction Z
// les cercles sont des polygones constitués d'une centaines de sommets
for(int i=0;i<10;i++)//boucle sur les cercles parallèles
{
glBegin(GL_POLYGON);//GL_LINE_STRIP);
glNormal3f(0.0,0.0,1.0);//la normale à chaque polygone est suivant Z
for(int j=0;j<TabNbPoints[i];j++)//TabNbPoints contient le nbre de sommets du polygone
{ //m_fx m_fy m_fz contiennent les valeurs x, y et z des sommets dans l'espace
GLfloat x=(GLfloat)(m_fx[i][j]/500.0);
GLfloat y=(GLfloat)(m_fy[i][j]/500.0);
GLfloat z=(GLfloat)(m_fz[i][j]/500.0);
glVertex3f(x,y,z);//dessine le sommet
}
glEnd();
}
glPopMatrix();
glFinish();
SwapBuffers(wglGetCurrentDC());
bBusy = FALSE;
}
0