- •Г.М. Набережнов, н.Н. Максимов трехмерное моделирование полигональными сетками
- •Казань 2008 Задания для самостоятельного выполнения
- •1. Понятие полигональнОй сетки
- •2. Построение полигональной сетки
- •3. Рисование полигональной сетки
- •4. Введение в модели закрашивания
- •5. Использование источников света в OpenGl
- •5.1. Создание источника света
- •5.3. Ослабление света с расстоянием
- •5.4. Перемещение источников света
- •5.2. Прожекторы
- •6. Работа со свойствами материалов в OpenGl
5. Использование источников света в OpenGl
5.1. Создание источника света
OpenGL позволяет задать до восьми источников с именами GL_LIGHT0, GL_LIGHT1 и т.д. Каждый источник обладает различными свойствами и должен быть задействован (включен). У каждого его свойства имеется значение по умолчанию. Например, для создания источника, расположенного в точке (1, 2, 2) в мировых координатах, следует выполнить следующий код:
Листинг 2. Пример создания источника света
GLfloat myLightPosition[] = {1.0, 2.0, 2.0, 1.0};
glLightfv(GL_LIGHT0, GL_POSITION, myLightPosition);
glEnable(GL_LIGHTING); // Включение расчета освещенности
glEnable(GL_LIGHT0); // включаем этот конкретный источник
Массив myLightPosition[] (имя можно использовать любое) определяет положение источника света и передается в функцию glLightfv() вместе с именем источника GL_LIGHT0, для того чтобы связать его с конкретным источником, обозначенным именем GL_LIGHT0.
Некоторые источники, такие как настольная лампа, находятся «внутри» сцены, в то время как другие, например солнце, бесконечно удалены от сцены. OpenGL позволяет создавать источники света обоих типов посредством задания положения источника в однородных координатах.
Тогда мы имеем
(x, y, z, 1): локальный источник света в положении (x, y, z) и
(x, y, z, 0): вектор к бесконечно удалённому источнику света в направлении (x, y, z).

Бесконечно удаленные источники света часто называют «направленными». Существуют определенные вычислительные преимущества в использовании направленных источников света, поскольку направление при вычислении диффузного и зеркального отражений одинаково для всех вершин данной сцены. Однако направленные источники света не всегда являются наилучшим выбором: некоторые визуальные эффекты достигаются только тогда, когда источник света расположен близко к объекту.
Можно также разложить источник света на различные цвета. OpenGL позволяет присвоить различный цвет каждому из трех типов света, испускаемого источником: фоновому, диффузному и зеркальному.
С помощью приведенного ниже кода определяются массивы для хранения цветов, испускаемых источниками света. Эти массивы затем передаются в функцию glLightfv():
Листинг 3. Пример задания цветов, испускаемых источником света
GLfloat myAmbient[] = {0.2, 0.4, 0.6, 1.0};
GLfloat myDiffuse[] = {0.8, 0.9, 0.5, 1.0};
GLfloat mySpecular[] = {1.0, 0.8, 1.0, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, myAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, myDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, mySpecular);
Цвета задаются в так называемом формате RGBA, что означает: Red (красный), Green (зеленый), Blue (синий) и Alpha (альфа). Величина alpha иногда используется для смешения двух цветов на экране. Для наших целей здесь alpha = 1.0.
Источники света имеют различные значения по умолчанию.
Для всех источников:
default ambient = (0, 0, 0, 1) фоновый по умолчанию.
Наименьшая яркость – черный.
Для источника света LIGHT0:
default diffuse = (1, 1, 1, 1) диффузный по умолчанию.
Наибольшая яркость – белый.
default specular = (1, 1, 1, 1) зеркальный по умолчанию.
Для других источников света значения диффузного и зеркального компонентов по умолчанию установлены в черный цвет.
