Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Освещение объектов
Цель лекции: Изучить команды 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.
Назначение параметра | Значение параметра | |
---|---|---|
Библиотека 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.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.