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();
    

Anmelden zum Antworten