Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 982 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 7:

Освещение объектов

< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Аннотация: В лекции рассматривается использование режима освещения в OpenGL и основные свойства материала.

Цель лекции: Изучить команды OpenGL включения и отключения источников света, изменения свойств материала примитивов, роль нормалей в освещении примитивов, а также реализацию этих команд на Object Pascal и в библиотеке OpenTK на C#.

Примеры на C# (WinForms) и Object Pascal (Delphi)

Пример № 6.1 Пример демонстрирует освещение примитивов без указания направления нормалей.

Пример № 6.2 Пример демонстрирует освещение примитивов c указанием направления нормалей.

Одним из элементов создания реалистичных изображений является освещение объектов. Освещение объектов в OpenGL неразрывно связано со свойствами источников света и свойствами материала примитивов.

Инициализация режима освещения

По умолчанию в библиотеке OpenGL режим освещения отключен. В этой ситуации цвет отображаемых объектов задается с помощью команды Color (см. раздел 3.4). Включение и выключение режима освещения осуществляется с помощью команд Enable и Disable с параметром:

C#:
  EnableCap.Lighting
Object Pascal:
  GL_LIGHTING

Включить и выключить режим освещения можно в любой момент после инициализации библиотеки OpenGL.

Для того чтобы объекты были освещены необходимо кроме включения режима освещения, также инициализировать хотя бы один из источников света. Для включения и отключения источников света также используются команды Enable и Disable, в качестве параметра указывается имя константы, определяющей номер источника света:

C#:
  EnableCap.Light0.. EnableCap.Light7
Object Pascal:
  GL_LIGHT0…GL_LIGHT7

Константы имеют однотипное название: последовательность символов "LIGHT" и номер источника света. Источники света нумеруются начиная с нуля.

Количество источников света определяется реализацией библиотеки. Библиотека OpenGL поддерживает не менее 8 источников света.

Свойства "нулевого" источника света (EnableCap.Light0 в библиотеке OpenTK (C#) и GL_LIGHT0 в Object Pascal) отличаются от других источников света. Он расположен в бесконечности и освещает сцену в отрицательном направлении оси OZ. Другие источники света после инициализации OpenGL имеют нулевую интенсивность всех составляющих освещения, поэтому для их использования необходимо кроме инициализации источника света, выполнить настройку их свойств. Так как "нулевой" источник света не требует дополнительной настройки, то часто используется для освещения, если нужен всего один источник света.

Если все объекты на сцене будут всегда освещены, то включить режим освещения и источник света можно сразу после инициализации библиотеки в обработчике события формы OnCreate в программе на Object Pascal (Delphi) или события Load в программе на C# с помощью команд:

C#:
  GL.Enable(EnableCap.Lighting);
  GL.Enable(EnableCap.Light0);
Object Pascal:
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);

После включения режима освещения для отображения граней примитивов используются свойства материала. Команда Color, определяющая цвет граней объектов, в этом режиме игнорируется.

Составляющие освещения

OpenGL использует модель освещения, в которой моделируются несколько составляющих освещения: рассеянная, диффузная, отраженная и эмиссионная составляющие.

Рассеянный свет

Это свет, попадающий на освещаемый объект после отражения от других объектов.

Его еще также называют рассеянным светом в окружающей среде. Направление его нельзя определить. Это, например, свет, отраженный от стен в комнате. В модели освещения OpenGL интенсивность рассеянного света не зависит от положения источника света и от точки наблюдения. При выключении источника света эта составляющая света также исчезает, т. к. обусловлена она источником света.

Диффузный свет

Это направленный свет от источника света, который равномерно рассеивается поверхностью. Он характерен для матовых поверхностей. Интенсивность освещения объектов рассеянным светом не зависит от точки наблюдения, пропорциональна косинусу угла между направлением нормали к поверхности и направлением на источник света, а также пропорциональна размеру вектора нормали.

Отраженный (зеркальный) свет

Это направленный свет от источника света, который отражается в определенном направлении. Он характерен для зеркальных поверхностей. Интенсивность зависит от трех факторов: положения источника света, нормали к поверхности и точки наблюдения. Для этой составляющей виден только тот свет, у которого угол падения равен углу отражения и положение наблюдателя совпадает с направлением отраженного света.

Эмиссионный свет (самосвечение)

Не добавляет освещение в общую сцену, делает объекты более яркими. Например, такая составляющая может использоваться для моделирования фар автомобиля, лампы накаливания.

Освещение примитивов

Для каждой грани примитива параметры освещения задаются индивидуально. Набор параметров освещения для каждой грани в библиотеке OpenGL называется свойствами материала. Поэтому можно сказать, что каждая грань примитива имеет свой материал. Свойства материала определяют рассеянную, диффузную, отражённую и эмиссионную составляющую освещения материала.

Свойства материала

Для задания свойств материала используется команда библиотеки OpenGL:

Material[i f][v](face, pname: GLenum; param: GLType)

Параметр face определяет грань примитива, для которой указываются параметры материала. Возможные значения перечислены в таблица 6.1.

Таблица 6.1. Значения параметра face команды Material
Назначение параметра Значение параметра
Библиотека OpenTK, C# Object Pascal
Лицевые грани многоугольников MaterialFace.Front GL_FRONT
Обратные грани многоугольников MaterialFace.Back GL_BACK
Лицевые и обратные грани многоугольников MaterialFace.FrontAndBack GL_FRONT_AND_BACK

Параметр pname определяет изменяемый параметр материала. Параметр param определяет значения изменяемого параметра. Для него в описании команды указан условный тип GLType, который обозначает, что тип этого параметра может быть различным и зависит от изменяемого параметра материала. Возможные значения параметра pname и значения параметра param по умолчанию приведены в таблица 6.2.

Таблица 6.2. Основные значения параметра pname команды Material
Назначение параметра, значение по умолчанию Значение параметра
Object Pascal OpenTK (C#)
Цвет и интенсивность рассеянной составляющей освещения материала, (0.2, 0.2, 0.2, 1) GL_AMBIENT MaterialParameter.Ambient
Цвет и интенсивность диффузной составляющей освещения материала, (0.8, 0.8, 0.8, 1) GL_DIFFUSE MaterialParameter.Diffuse
Цвет и интенсивность зеркальной составляющей освещения материала, (0, 0, 0, 1) GL_SPECULAR MaterialParameter.Specular
Зеркальная экспонента, (0.0) GL_SHININESS MaterialParameter.Shininess
Цвет и интенсивность излучаемого света материала, (0, 0, 0, 1.0) GL_EMISSION MaterialParameter.Emission
Цвет и интенсивность рассеянной и диффузной составляющих освещения материала GL_AMBIENT_AND_DIFFUSE MaterialParameter.AmbientAndDiffuse

Пример определения диффузной составляющей для лицевой грани материала приведен в листинге 6.1 на C# и в листинге 6.2 на Object Pascal:

GL.Material(MaterialFace.Front, MaterialParameter.Diffuse,
new float[] { 1f, 0.2f, 0.2f, 1.0f });
Листинг 6.1. Пример определения диффузной составляющей материала на C#
var
  params: TGLArrayf4;
begin
  ...
  params[0] := 1;
  params[1] := 0.2;
  params[2] := 0.2;
  params[3] := 1;
  glMaterialfv(GL_FRONT, GL_DIFFUSE, @params);
  ...
end;
Листинг 6.2. Пример определения диффузной составляющей материала на Object Pascal

Тип TGLArrayf4 объявлен в файле OpenGL.pas и определяет массив вещественных значений типа GLfloat.

< Лекция 6 || Лекция 7: 12 || Лекция 8 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?