Opengl cube light не является правильным
Я написал программу OpenGL, которая показывает куб.
Но свет не правильный, потому что, когда я вращаю куб, не все грани правильно освещены: есть две грани, которые кажутся черными.
Вот код:
#include<GL\glut.h><br /> #include<GL\GL.h>º<br /> <br /> float rotX = 0.0, rotY = 0.0;<br /> <br /> void light ()<br /> {<br /> static float Position [] = {0.0, 0.0, 1.0, 0.0};<br /> static float Diffuse [] = {0.8, 0.8, 0.8, 1.0};<br /> static float Ambient [] = {0.3, 0.3, 0.3, 1.0};<br /> static float Specular [] = {1.0, 1.0, 1.0, 1.0};<br /> <br /> glLightfv(GL_LIGHT0, GL_POSITION, Position);<br /> glLightfv(GL_LIGHT0, GL_DIFFUSE, Diffuse);<br /> glLightfv(GL_LIGHT0, GL_AMBIENT, Ambient);<br /> glLightfv(GL_LIGHT0, GL_SPECULAR, Specular);<br /> <br /> glEnable(GL_LIGHTING);<br /> glEnable(GL_LIGHT0);<br /> }<br /> <br /> void drawCube(void)<br /> {<br /> int i;<br /> <br /> GLfloat n[6][3] = { /* Normals for the 6 faces of a cube. */<br /> {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},<br /> {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };<br /> <br /> GLint faces[6][4] = { /* Vertex indices for the 6 faces of a cube. */<br /> {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},<br /> {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };<br /> <br /> GLfloat v[8][3]; /* Will be filled in with X,Y,Z vertexes. */<br /> <br /> v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;<br /> v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;<br /> v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;<br /> v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;<br /> v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;<br /> v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;<br /> <br /> for (i = 0; i < 6; i++) {<br /> glBegin(GL_QUADS);<br /> glNormal3fv(&n[i][0]);<br /> glVertex3fv(&v[faces[i][0]][0]);<br /> glVertex3fv(&v[faces[i][1]][0]);<br /> glVertex3fv(&v[faces[i][2]][0]);<br /> glVertex3fv(&v[faces[i][3]][0]);<br /> glEnd();<br /> }<br /> }<br /> <br /> void display ()<br /> {<br /> glClear(GL_COLOR_BUFFER_BIT);<br /> glClear(GL_DEPTH_BUFFER_BIT);<br /> <br /> glMatrixMode(GL_MODELVIEW);<br /> glLoadIdentity();<br /> <br /> float diffuse [] = {1.0, 1.0, 0.0};<br /> glMaterialfv (GL_FRONT, GL_DIFFUSE, diffuse);<br /> <br /> glTranslatef(0.0,0.0,-5.0);<br /> glRotatef(rotX, 0.0, 1.0, 0.0);<br /> glRotatef(rotY, 1.0, 0.0, 0.0);<br /> <br /> drawCube();<br /> <br /> glFlush();<br /> }<br /> <br /> void reshape (int w, int h)<br /> {<br /> float aspect = (float)w/(float)h;<br /> <br /> glViewport(0, 0, w, h);<br /> <br /> glMatrixMode(GL_PROJECTION);<br /> glLoadIdentity();<br /> <br /> gluPerspective(60.0, aspect, 0.1, 10.0);<br /> }<br /> <br /> void special (int key, int, int)<br /> {<br /> switch (key)<br /> {<br /> case GLUT_KEY_UP: rotY -= 1.0; break;<br /> case GLUT_KEY_DOWN: rotY += 1.0; break;<br /> case GLUT_KEY_LEFT: rotX -= 1.0; break;<br /> case GLUT_KEY_RIGHT: rotX += 1.0; break;<br /> default: return;<br /> }<br /> <br /> glutPostRedisplay();<br /> }<br /> <br /> int main (int argc, char* argv [])<br /> {<br /> glutInit(&argc, argv);<br /> glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE|GLUT_DEPTH);<br /> glutCreateWindow("Cube");<br /> glutReshapeWindow(640,480); <br /> <br /> glutDisplayFunc(display);<br /> glutReshapeFunc(reshape);<br /> glutSpecialFunc(special);<br /> <br /> glClearColor(0.0, 0.0, 0.0, 1.0);<br /> <br /> light();<br /> <br /> glEnable(GL_DEPTH_TEST);<br /> <br /> glutMainLoop();<br /> <br /> return 0;<br /> }
Кто-нибудь может мне помочь?
Что я уже пробовал:
Я попытался исправить нормали и прочитал куб.C учебник из OpenGL.