OpenGL Licht funktioniert nicht!
-
Ich habe ein Problem mit dem Licht in OpenGL.
Wenn ich z.B. einen Würfel darstellen lassen möchte kann ich entweder glutSolidCube() aufrufen
oder selber einen mit GL_QUADS erstellen.Der folgende Code sollte eigentlich zwei identische Würfel erzeugen, jedoch reflektiert der mit
glutSolidCube() erstellte Würfel das Licht und der andere nicht.float angle = 0.0; void cube() { glPushMatrix(); glTranslatef(-2.5f, 0.0f, -10.0f); glRotatef(angle, 1.0, 0.0, 0.0); glRotatef(angle, 0.0, 1.0, 0.0); glRotatef(angle, 0.0, 0.0, 1.0); glColor3f(1.0, 0.0, 0.0); glutSolidCube(2); glPopMatrix(); } void myCube() { glPushMatrix(); glTranslatef(2.5f, 0.0f, -10.0f); glRotatef(angle, 1.0, 0.0, 0.0); glRotatef(angle, 0.0, 1.0, 0.0); glRotatef(angle, 0.0, 0.0, 1.0); glColor3f(1.0, 0.0, 0.0); glBegin(GL_QUADS); glVertex3f(-1,-1,-1); glVertex3f(1,-1,-1); glVertex3f(1,1,-1); glVertex3f(-1,1,-1); glVertex3f(-1,-1,1); glVertex3f(1,-1,1); glVertex3f(1,1,1); glVertex3f(-1,1,1); glVertex3f(-1,-1,-1); glVertex3f(-1,-1,1); glVertex3f(-1,1,1); glVertex3f(-1,1,-1); glVertex3f(1,-1,-1); glVertex3f(1,-1,1); glVertex3f(1,1,1); glVertex3f(1,1,-1); glVertex3f(-1,-1,-1); glVertex3f(-1,-1,1); glVertex3f(1,-1,1); glVertex3f(1,-1,-1); glVertex3f(-1,1,-1); glVertex3f(-1,1,1); glVertex3f(1,1,1); glVertex3f(1,1,-1); glEnd(); glPopMatrix(); } void init() { glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_COLOR_MATERIAL); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); } void display() { glClearColor(0.0,0.0,0.0,1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); cube(); myCube(); glutSwapBuffers(); ++angle; } void reshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (float)w / (float)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); } int main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); glutInitWindowSize(1280, 720); glutInitWindowPosition(0, 0); glutCreateWindow("light test"); init(); glutDisplayFunc(display); glutIdleFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; }
http://img233.imageshack.us/img233/9955/70572115.png
Wieso?
-
Du musst Normalenvektoren angeben -> glNormal
-
OK, so gehts:
glBegin(GL_QUADS); glNormal3d(0, 0, -1); glVertex3f(-1,-1,-1); glVertex3f(1,-1,-1); glVertex3f(1,1,-1); glVertex3f(-1,1,-1); glNormal3d(0, 0, 1); glVertex3f(-1,-1,1); glVertex3f(1,-1,1); glVertex3f(1,1,1); glVertex3f(-1,1,1); glNormal3d(-1, 0, 0); glVertex3f(-1,-1,-1); glVertex3f(-1,-1,1); glVertex3f(-1,1,1); glVertex3f(-1,1,-1); glNormal3d(1, 0, 0); glVertex3f(1,-1,-1); glVertex3f(1,-1,1); glVertex3f(1,1,1); glVertex3f(1,1,-1); glNormal3d(0, -1, 0); glVertex3f(-1,-1,-1); glVertex3f(-1,-1,1); glVertex3f(1,-1,1); glVertex3f(1,-1,-1); glNormal3d(0, 1, 0); glVertex3f(-1,1,-1); glVertex3f(-1,1,1); glVertex3f(1,1,1); glVertex3f(1,1,-1); glEnd();