2017-06-26 14 views
-1

J'ai de la difficulté à faire fonctionner l'éclairage uniquement sur la partie en déclin de mon terrain. Voici mon code pour le sol et la baisse (ce qui en fait un fossé):L'éclairage ne fonctionne pas en mode ouvert

static void ground(double x, double y, double z, double dx, double dy, 
double dz){ 
float white[] = {1,1,1,1}; 
float Emission[] = {0.0,0.0,0.01*emission,1.0}; 
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shiny); 
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,white); 
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,Emission); 
// Save transformation 
glPushMatrix(); 
// Offset, scale and rotate 
glTranslated(x,y,z); 
glScaled(dx, dy, dz); 

glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); 

glBindTexture(GL_TEXTURE_2D, textures[2]); 
glBegin(GL_QUADS); 
glColor3f(0.5, 1.0, 0.5); 
glNormal3f(0,0,0); 
glTexCoord2f(0.0, 0.0); glVertex3f(-100, 0, -300); 
glTexCoord2f(300.0,0.0); glVertex3f(-100,0,300); 
glTexCoord2f(300.0,300.0); glVertex3f(-3,0,300); 
glTexCoord2f(0.0,300.0); glVertex3f(-3,0,-300); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, textures[2]); 
glBegin(GL_QUADS); 
glColor3f(1.0, 1.0, 0.5); 
glNormal3f(0,0,-1); 
glTexCoord2f(0.0, 0.0); glVertex3f(-2.99,0,-300); 
glTexCoord2f(300.0,0.0); glVertex3f(-2.99,0,300); 
glTexCoord2f(300.0,300.0); glVertex3f(-1,-1,300); 
glTexCoord2f(0.0,300.0); glVertex3f(-1,-1,-300); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, textures[2]); 
glBegin(GL_QUADS); 
glColor3f(1.0, 1.0, 0.5); 
glNormal3f(0,0,1); 
glTexCoord2f(0.0, 0.0); glVertex3f(0.99,-1,-300); 
glTexCoord2f(300.0,0.0); glVertex3f(0.99,-1,300); 
glTexCoord2f(300.0,300.0); glVertex3f(2.99,0,300); 
glTexCoord2f(0.0,300.0); glVertex3f(2.99,0,-300); 
glEnd(); 

glBindTexture(GL_TEXTURE_2D, textures[2]); 
glBegin(GL_QUADS); 
glColor3f(0.5, 1.0, 0.5); 
glNormal3f(0,0,0); 
glTexCoord2f(0.0, 0.0); glVertex3f(2.99, 0, -300); 
glTexCoord2f(300.0,0.0); glVertex3f(2.99,0,300); 
glTexCoord2f(300.0,300.0); glVertex3f(100,0,300); 
glTexCoord2f(0.0,300.0); glVertex3f(100,0,-300); 
glEnd(); 

glPopMatrix(); 

glDisable(GL_TEXTURE_2D); 

} 

Ainsi, le code n'a pas l'avoir un éclairage Le fonctionnement est correctement deux extraits de moyen « glBegin (GL_QUADS) »

+1

@BenSteffan C'est pour un projet de classe donc j'ai utilisé ce qu'on m'a dit d'utiliser. –

+0

Modifier dans un [mcve]. – genpfault

+1

@RyanFasching Vous a-t-on spécifiquement demandé d'utiliser cette version d'OpenGL? Ben ne dit pas que OpenGL est obsolète, il dit que ce code, spécifiquement, est pour une ancienne version d'OpenGL. Utilisez la version la plus récente, sauf si vous avez été explicitement dit d'utiliser une certaine version. Aussi, s'il vous plaît [modifier] votre question pour inclure un [mcve], ainsi qu'une description du problème réel - "Je ne peux pas le faire fonctionner" est inutile. Que veux-tu qu'il fasse? Que fait-il à la place? Dans ce cas, les captures d'écran peuvent être utiles. –

Répondre

1

Ceci est juste une instance de GIGO (garbage in, garbage out):

glNormal3f(0,0,0); 

Non. Ce n'est pas un vecteur normal valide, et va totalement casser tout calcul d'éclairage.

Le prochain

glNormal3f(0,0,-1); 
glTexCoord2f(0.0, 0.0); glVertex3f(-2.99,0,-300); 
glTexCoord2f(300.0,0.0); glVertex3f(-2.99,0,300); 
glTexCoord2f(300.0,300.0); glVertex3f(-1,-1,300); 
glTexCoord2f(0.0,300.0); glVertex3f(-1,-1,-300); 

est au moins un vecteur non nul, mais il est pas normal au visage que vous décrivez, de sorte que l'éclairage sera tout simplement faux.