Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_4 Трехмерное моделирование полигональными с....doc
Скачиваний:
29
Добавлен:
04.12.2018
Размер:
275 Кб
Скачать
☆

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) зеркальный по умолчанию.

Для других источников света значения диффузного и зеркального компонентов по умолчанию установлены в черный цвет.