Урок 4 - Нормали
Нормаль – это вектор, перпендикулярный к плоскости. С помощью нормалей OpenGL рассчитывает освещённость примитива.
Чем сильнее отклонён вектор нормали от источника света, тем меньше будет яркость примитива.
Нормаль задаётся функцией glNormal3f(x, y, z). Где x, y, z – координаты вектора нормали колеблющиеся от -1 до 1.
Например:
Нарисуем квадрат и зададим нормаль перпендикулярную к нему.
glBegin(GL_QUADS); //рисуем квадрат glNormal3f(0,0,1); //задаём нормаль glVertex3f(-1,1,0); //первая вершина glVertex3f(1,1,-0); //вторая вершина glVertex3f(1,-1,-0); //третья вершина glVertex3f(-1,-1,0); //четвёртая вершина glEnd;Нормаль можно задавать, как и от грани, так и от вершин, но для этого функцию надо вызывать перед рисованием каждой вершины.
glBegin(GL_QUADS); //рисуем квадрат glNormal3f(0,0,1); //задаём нормаль glVertex3f(-1,1,0); //первая вершина glNormal3f(0,0,1); //задаём нормаль glVertex3f(1,1,-0); //вторая вершина glNormal3f(0,0,1); //задаём нормаль glVertex3f(1,-1,-0); //третья вершина glNormal3f(0,0,1); //задаём нормаль glVertex3f(-1,-1,0); //четвёртая вершина glEnd;Никакой разницы не будет. Нормали от вершин следует задавать для получения сглаженной фигуры (не рубленной). Увидеть разницу между сглаженной моделью и рубленной, в примере предыдущего урока необходимо добавить в конец процедуры FormCreate:
glShadeModel(GL_FLAT) //Режим без сглаживания //или glShadeModel(GL_SMOOTH) //Сглаживание. По умолчанию установлен режим GL_SMOOTH.
![]() glShadeModel(GL_SMOOTH) |
![]() glShadeModel(GL_FLAT) |
Для того чтобы лучше понять что такое нормаль, я создал пример иллюстрирующий работу нормали.

Стрелками на клавиатуре можно изменять координаты нормали, она обозначена, синей линией, а красной линией обозначена правильно заданная нормаль. В заголовке формы выводится текущие координаты нормали. Источник света находится в точке зрения. Если направить синюю линию в точку зрения, то квадрат примет максимальную яркость.
В следующем уроке мы узнаем, что такое материалы и освещение в OpenGL.