C ++ OpenGL освещение освещает только определенные стены

Я освещаю свою сцену в opengl и там 4 стены, только 2 из них освещаются.
Я думаю, что что-то не так с нормальными, но я не уверен.

Это код освещения:

glShadeModel(GL_SMOOTH);
//glEnable(GL_CULL_FACE);

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);

GLfloat lightpos0[] = {-5, 1, 0, 0.};
GLfloat AmbientLight0[] = {0.2, 0.2, 0.2,1.0};
GLfloat DiffuseLight0[] = {0.8, 0.8, 0.8,1.0};
GLfloat SpecularLight0[] = {1.0, 1.0, 1.0,1.0};

glLightfv(GL_LIGHT0, GL_POSITION, lightpos0);
glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientLight0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseLight0);
glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularLight0);

GLfloat lightpos1[] = {5, 1, 0, 0};
GLfloat AmbientLight1[] = {0.2, 0.2, 0.2,1.0};
GLfloat DiffuseLight1[] = {0.8, 0.8, 0.8,1.0};
GLfloat SpecularLight1[] = {1.0, 1.0, 1.0,1.0};

glLightfv(GL_LIGHT1, GL_POSITION, lightpos1);
glLightfv(GL_LIGHT1, GL_AMBIENT, AmbientLight1);
glLightfv(GL_LIGHT1, GL_DIFFUSE, DiffuseLight1);
glLightfv(GL_LIGHT1, GL_SPECULAR, SpecularLight1);

Это код для рисования 4 стен.

    //north
glBegin(GL_QUADS);
glNormal3f(1.0,0,0);
glVertex3f(-10,0,-10);
glVertex3f( 10,0,-10);
glVertex3f( 10,5,-10);
glVertex3f(-10,5,-10);
glEnd();
//south
glBegin(GL_QUADS);
glNormal3f(-1.0, 0, 0);
glVertex3f(-10,0, 10);
glVertex3f( 10,0, 10);
glVertex3f( 10,5, 10);
glVertex3f(-10,5, 10);
glEnd();
//east
glBegin(GL_QUADS);
glNormal3f(0,0, -1.0);
glVertex3f( 10,0,-10);
glVertex3f( 10,0,10);
glVertex3f( 10,5,10);
glVertex3f( 10,5,-10);
glEnd();
//west
glBegin(GL_QUADS);
glNormal3f(0,0,1.0);
glVertex3f( -10,0,-10);
glVertex3f( -10,0,10);
glVertex3f( -10,5,10);
glVertex3f( -10,5,-10);
glEnd();

Если это поможет, вот и изображение того, что происходит: http://i.stack.imgur.com/xRgVL.png

1

Решение

Кажется, что вы передаете неправильный нормальный вектор на стены.

Если ваша стена получила Z = -10 для всех точек (стена параллельна X), то у нее должен быть вектор нормали, направленный в положительном направлении Z: (0,0,1).
То же самое верно для всех направлений.

Попробуй это:

glBegin(GL_QUADS);
glNormal3f(0,0,1);
glVertex3f(-10,0,-10);
glVertex3f( 10,0,-10);
glVertex3f( 10,5,-10);
glVertex3f(-10,5,-10);
glEnd();
//south
glBegin(GL_QUADS);
glNormal3f(0, 0, -1);
glVertex3f(-10,0, 10);
glVertex3f( 10,0, 10);
glVertex3f( 10,5, 10);
glVertex3f(-10,5, 10);
glEnd();
//east
glBegin(GL_QUADS);
glNormal3f(-1,0, -0);
glVertex3f( 10,0,-10);
glVertex3f( 10,0,10);
glVertex3f( 10,5,10);
glVertex3f( 10,5,-10);
glEnd();
//west
glBegin(GL_QUADS);
glNormal3f(1, 0, 0);
glVertex3f( -10,0,-10);
glVertex3f( -10,0,10);
glVertex3f( -10,5,10);
glVertex3f( -10,5,-10);
glEnd();
1

Другие решения

Как указал Владислав Хорев, нормали должны быть направлены вне общей для всех точек координаты (учитывая это специальное ортогональное расположение).
Но также следует учитывать обмотку многоугольников:

 // Polygon A --  north     Polygon B -- south
glVertex3f(-10,0,-10);     glVertex3f(-10,0, 10);
glVertex3f( 10,0,-10);     glVertex3f( 10,0, 10);
glVertex3f( 10,5,-10);     glVertex3f( 10,5, 10);
glVertex3f(-10,5,-10);     glVertex3f(-10,5, 10);
Normal(0,0,1),             Normal(0,0,-1);

Два полигона (север и юг) имеют разную обмотку. Первый — ClockWise, наблюдаемый с точки 0,0,0, а второй — против часовой стрелки. Нужно соответствовать этим.

2

По вопросам рекламы [email protected]