2010-10-26 2 views
4

Je suis au milieu d'un projet enseignant les bases de OpenGL. J'ai la plupart des exigences fonctionnant bien en termes de rotation de la caméra, de traduction, etc. Cependant, je me bats beaucoup avec l'éclairage.OpenGL Lighting lutte

Cette image est une comparaison entre mon programme actuel (à gauche) et la solution d'échantillon (à droite). Au cas où vous ne le sauriez pas, je reçois des couleurs très monochromes sur le camion. Les ombres sont très tranchantes et sombres, les points hauts sont singulièrement colorés au lieu de spéculaires. Le projet nécessite l'utilisation de textures; celui que j'ai montré ici est une texture basique de pixels gris unis mais je pourrais utiliser n'importe quelle texture (y compris celle de sable de plage utilisée pour le sol). Je dessine l'objet d'un maillage:

GLfloat ambient[] = {0.1, 0.1, 0.1, 1}; 
GLfloat diffuse[] = {0.1, 0.1, 0.1, 1}; 
GLfloat specular[] = {1.0, 1.0, 1.0, 1.0}; 
GLfloat shine = 100.0; 

glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); 
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); 
glMaterialfv(GL_FRONT, GL_SPECULAR, specular); 
glMaterialf(GL_FRONT, GL_SHININESS, shine); 

glEable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureNumber); 
glBegin(GL_TRIANGLES); 

for (int i = 0; i < meshes[n]->nTriangles; i++) { 
    for (int j = 0; j < 3; j++) { 
     glNormal3fv(mesh -> normals[mesh->triangles[i][j]]); 
     glTexCoord2fv(mesh->texCoords[mesh->triangles[i][j]]); 
     glVertex3fv(mesh -> vertices[mesh->triangles[i][j]]); 
    } 
} 
glEnd(); 

Il y a une lumière dans la scène:

glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 
glEnable(GL_DEPTH_TEST) 


GLfloat diffuse0[]={1.0, 1.0, 1.0, 1.0}; 
GLfloat ambient0[]={1.0, 1.0, 1.0, 1.0}; 
GLfloat specular0[]={1.0, 1.0, 1.0, 1.0}; 
GLfloat light0_pos[]={1.0, 1.0, 1,0, 1.0}; 

glLightfv(GL_LIGHT0, GL_POSITION, light0_pos); 
glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0); 
glLightfv(GL_LIGHT0, GL_SPECULAR, specular0); 

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0); 
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0); 
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 2.0); 

Y at-il quelque chose d'important que je manque qui pourrait être la cause de cette différence grave? Des valeurs particulières avec lesquelles je devrais jouer? Ou un appel glEnable j'ai raté? Toute aide, conseil ou pointeur ailleurs apprécié.

Répondre

2

Pour éliminer la forte baisse -off, amplifie la lumière ambiante. Il n'y a pas de modèle d'illumination globale dans OpenGL, donc ce paramètre n'a absolument aucun effet au-delà de la couleur du visage si aucune autre lumière ne tombe dessus. Puisque vous utilisez des appels de type glVertex, je vais sortir de l'ornière et deviner que vous utilisez le pipeline de fonctionnalités fixes. Si c'est le cas, l'éclairage est calculé aux sommets, puis interpolé sur les surfaces polygonales. Cela signifie que les hautes lumières spéculaires ne fonctionnent pas très bien sur les 'grands' polygones - en gros, le point culminant ne peut pas apparaître au milieu d'un polygone. Les GPU avec des pipelines programmables (qui incluent ceux des téléphones mobiles de nos jours) peuvent calculer l'éclairage par pixel au lieu du vertex, mais OpenGL ne le fait pas pour vous, vous devez donc vous plonger dans la programmation des shaders. Ou assurez-vous simplement que votre modèle est constitué de polygones suffisamment petits. Votre exposant brillance est également assez élevé - avez-vous essayé de composer le bas de quelques crans?

1

quand on regarde l'arrière-plan, il ressemble à un coup de projecteur à droite baignant juste la scène dans une lumière chaude, et un Flakscheinwerfer sur le tout se prélassant à gauche dans la foudre extrême, ce qui élimine toute ombre

+0

... et qui aide comment? – DarkDust

+1

peut-être qu'il peut expérimenter avec les valeurs de diffuses (pas si vives 1.0) ambiant et spéculaire? sa lumière est une grande étoile blanche qui brille dans toutes les directions, s'il accorde les valeurs à un projecteur plus jaunâtre, il obtiendra de meilleurs résultats. –