Цель лекции: Изучить команды OpenGL изменения свойств источников света, реализацию этих команд на Object Pascal и в библиотеке OpenTK на C#.
Для каждого источника света параметры определяются индивидуально. Параметры для первого источника света (источник света с индексом ноль) отличаются от параметров остальных источников света.
Для задания параметров источника света используется команда:
Light[if][v](light, pname: GLenum; param: GLType);
Параметры команды имеют следующие значения:
light - источник света;pname - изменяемый параметр материала;param – значение или указатель на массив значений изменяемого параметра.Ниже приведены объявления методов класса GL библиотеки OpenTK на C# и процедур на Object Pascal, реализующих команду Light, для параметра param вещественного типа.
C#: void Light(LightName light, LightParameter pname, float param); void Light(LightName light, LightParameter pname, float[] @params); Object Pascal: procedure glLightf (light, pname: GLenum; param: GLfloat); procedure glLightfv (light, pname: GLenum; params: PGLfloat);
Как и для свойств материала для источника света можно определить фоновую, диффузную, рассеянную и зеркальную составляющие освещения.
Кроме того, для источника света могут быть определены положение источника света, сфокусированность, направленность, зависимость интенсивности освещения от расстояния до освещаемого объекта.
Результирующее освещение примитива зависит от свойств источников света и от свойств материала примитива.
Рассеянная (Ambient) составляющая освещения примитива от одного источника света представляет собой произведение рассеянной составляющей этого источника света и рассеянной составляющей материала:
$$A=A_{ист.света} \times A_{материала}$$Диффузная (Diffuse) составляющая зависит не только от соответствующих составляющих источника света и материала, но и от косинуса угла между направлением нормали и направлением от вершины к источнику света:
$$D=(max(\vec{L} \times \vec{N},0))\times D_{ист.света}\times D_{материала}$$$$\vec{L}\times(Lx,Ly,Lz) $$ – единичный вектор от вершины к источнику света;
$$\vec{N}\times(nx,ny,nz) $$ – единичный вектор нормали.
Зеркальная составляющая также зависит от соответствующих составляющих источника света и материала, нормали и вектора от вершины к источнику света, точки наблюдения, а так же от значения параметра $$SHININESS$$, который определяется для материала.
$$S=(max(\vec{S} \times \vec{N},0))^{shininess}\times S_{ист.света}\times S_{материала}$$где
Ослабление источника света с увеличением расстояния до объекта библиотека OpenGL определяет по формуле:
где:
$$l$$ - расстояние от источника света до объекта;
$$k_0$$ – коэффициент постоянного ослабления;
$$k_1$$ – коэффициент линейного ослабления;
$$k_2$$ – коэффициент квадратичного ослабления.
Определение фоновой составляющей освещения осуществляется с помощью параметра pname команды Light. При использовании библиотеки OpenTK (C#) параметр должен быть равен значению Ambient перечисления LightParameter, в Object Pascal - константе GL_AMBIENT.
На C# параметр param является массивом четырёх вещественных значений, содержащих RGBA составляющие фонового освещения.
В Object Pascal параметр param является указателем на массив из четырех значений, которые также определяют RGBA составляющие фонового освещения.
Примеры изменения фоновой составляющей приведены в листинге 7.1 - на C# и в листинге 7.2 - на Object Pascal.
GL.Light(LightName.Light0, LightParameter.Ambient, new float[] {0.1f, 0.0f, 0.0f, 1.0f});
Var params: TGLArrayf4; Begin … params[0] := 1; params[1] := 0; params[2] := 0; params[3] := 1; glLightfv(GL_LIGHT0, GL_AMBIENT, @params); … End;
По умолчанию значение фонового освещения для всех источников света равно (0, 0, 0, 1).
Для изменения диффузной составляющей источника света используется значение параметра pname команды Light:
C#: LightParameter.Diffuse Object Pascal: GL_DIFFUSE
По умолчанию значение диффузного освещения "нулевого" источника света равно (1, 1, 1, 1), для других источников света составляющая равна (0, 0, 0, 1).
Интенсивность и цвет зеркального отражения от источника света определяет значение параметра pname команды Light:
C#: LightParameter.Specular Object Pascal: GL_SPECULAR
По умолчанию значение зеркального отражения от "нулевого" источника света равно (1, 1, 1, 1), для других источников света она равна (0, 0, 0, 1).
Для определения положения источника света в пространстве используется значение для параметра pname команды Light:
C#: LightParameter.Position Object Pascal: GL_POSITION
В качестве значения параметра param команды Light в библиотеке OpenTK (C#) передается массив из четырех значений, в Object Pascal - указатель на массив из четырёх значений.
Значения массива определяют нормализованные координаты источника света в пространстве. Если положение источника света необходимо задать в декартовых координатах (что чаще всего используется), то четвертый параметр массива должен быть равен 1, а первые три параметра должны определять декартовые координаты x, y, z.
Эта позиция преобразуется видовой матрицей и сохраняется в видовых координатах. Если компонент положения w (последний элемент массива) равен нулю, то источник света расположен в бесконечности, освещение от него направлено в начало координат, ослабление освещения от расстояния в этом случае не происходит.
По умолчанию нулевой источник освещения имеет координаты (0, 0, 1 ,0), и является направленным вдоль отрицательного направления оси OZ.
Для определения направления источника света в однородных мировых координатах для параметра pname команды Light используется значение:
C#: LightParameter.SpotDirection Object Pascal: GL_SPOT_DIRECTION
Параметр params должен содержать указатель на четыре значения, определяющих направление источника света в однородных мировых координатах. По умолчанию направление источника света задается значениями (0, 0, 1, 1). Отработка этого параметра имеет смысл, если угол освещения источником света имеет значение отличное от 180° (параметр LightParameter.SpotCutoff на C# и GL_SPOT_CUTOFF на Object Pascal).
Для определения сфокусированности источника света используется значение для параметра pname команды Light:
C#: LightParameter.SpotExponent Object Pascal: GL_SPOT_EXPONENT
Параметр param должен содержать целое или вещественное значение из диапазона [0, 128]. Максимальное значение соответствует максимальной сфокусированности источника света. Значение 0 соответствует рассеянному освещению, которое используется как значение по умолчанию для всех источников света.
Mаксимальный угол разброса излучения света определяется командой Light с помощью значения параметра pname:
C#: LightParameter.SpotCutoff Object Pascal: GL_SPOT_CUTOFF
Параметр param должен содержать значение из диапазона [0, 90] или 180, которое задает максимальный угол разброса излучения света. Чем больше это значение, тем больше область освещения. По умолчанию данный параметр имеет значение 180, что соответствует рассеянному освещению.
Для определения ослабления источника света с увеличением расстояния до освещаемого примитива так же используется команда Light.
Как уже описывалось выше, определение зависимости интенсивности освещения от расстояния в OpenGL выполняется по формуле:
Для изменения коэффициентов $$k_0,k_1,k_2$$ используются значения параметра .
| Константа | Значение параметра pname команды Light | |
|---|---|---|
| Библиотека OpenTK, C# | Object Pascal | |
| $$k_0$$ | LightParameter.ConstantAttenuation | GL_CONSTANT_ATTENUATION |
| $$k_1$$ | LightParameter.LinearAttenuation | GL_LINEAR_ATTENUATION |
| $$k_2$$ | LightParameter.QuadraticAttenuation | GL_QUADRATIC_ATTENUATION |
Все источники света библиотеки OpenGL можно разделить на две группы: точечные и бесконечно удалённые. Точечные источники света имеют конкретные координаты. У бесконечно удаленных источников света четвертая координата равна нулю. "Нулевой" источник света относится к бесконечно удалённым источникам света, так как его координаты (0,0,1,0). Бесконечно удаленные источники света всегда направлены в начало координат. Для всех источников света могут быть определены рассеянная, диффузная и зеркальная составляющие освещения.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.