Источники света в OpenGL | MetodPro.ru

Реклама на сайте

Источники света в OpenGL


В OpenGL используется два типа источников света - направленные и позиционные.

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

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

Для изучения свойств позиционных источников света используем метафору фонаря (рис. __), достаточно хорошо соответствующую реальным свойствам источника света OpenGL.

 

 

Рис. __. Модель источника освещения

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

Теперь рассмотрим, как эти и другие параметры источника света устанавливаются в OpenGL.

Источник света с номером i, включается или выключается командами glEnable или gIDisable с аргументом GL_LIGHTi, который определяется как GL_LIGHTi = GL_LIGHT0 + i, , где i лежит в диапазоне от 0 до GL_MAX_LIGHTS -  которое не может быть больше восьми. Общее число источников зависит от реализации. Источники можно включать или выключать в любое время, но лучше перед включением установить их параметры.

Установка параметров источников света производится командой gILight, значения аргументов которой зависят от того, работаем с ее скалярной или векторной версией:

gILight[i f]v(light GLenum, pname GLenum, param GLfloat)

Аргумент light определяет номер источника света, аргумент рnате является символической константой, определяющей устанавливаемый параметр. Аргумент param определяет значение, которое устанавливается для параметра рnате источника с именем light.

Скалярной версией команды можно установить следующие значения pname:

GL_SPOT_EXPONENT - Параметр param содержит единственное целое или вещественное значение, которое задает распределение интенсивности света внутри светового конуса. Доступны значения из диапазона [0, 128]. Эффективность интенсивности света ослабевает пропорционально косинусу угла между направлением от источника и нормалью в вершине (рис. 2). Чем больше это значение, тем более сфокусирован источник света. По умолчанию установлено значение 0, что соответствует равномерному рассеянию по всему световому конусу. В нашей метафоре этот параметр соответствует вращению отражателя.

 

 

 

GL_SPOT_CUTOFF - Параметр раrат является целым или вещественным значением, которое определяет максимальный угол разброса источника света (световой конус). Доступны значения из диапазона [0, 90] и 180. По умолчанию используется значение 180, что соответствует рассеянному свету. В нашей метафоре этот параметр определяет конструкцию отражателя. При значении 180 происходит смена метафоры. Фонарь заменяется на лампочку (без абажура).

GL_CONSTANT_ATTENUATION, GL_LINEAR_ATTENUATION, GL_QUADRATIC_ATTENUATION - Параметр раrат задает единственное целое или вещественное значение, определяющее один из трех факторов ослабления — постоянного, линейного или квадратичного. Допустимыми являются только неотрицательные значения. Интенсивность источника света ослабевает в соответствии с суммарным значением: постоянного фактора, линейного фактора, умноженного на расстояние между источником и вершиной, и квадратичного фактора, умноженного на квадрат того же расстояния:

______1______  ,

k0i+k1iSi+k2iS2i

где ki - соответствующие коэффициенты ослабления, a Si - расстояние от источника. По умолчанию факторы ослабления имеют значения (1, 0, 0).

С помощью векторной версии команды  glLight[i f]v можно задать дополнительные значения параметра pname:

GL_AMBIENT - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность фонового освещения. По умолчанию значение рассеянного света равно (0.0, 0.0, 0.0, 1.0).

GL_DIFFUSE - Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность диффузного освещения. По умолчанию значение интенсивности диффузного света равно (0.0, 0.0, 0.0, 1.0) для всех источников кроме нулевого, для которого эта интенсивность равна (1.0, 1.0, 1.0, 1.0).

GL_SPECULAR -Параметр params содержит четыре целых или вещественных значения RGBA, которые определяют интенсивность освещения зеркального отражения. По умолчанию значение интенсивности зеркального отражения равно (0.0, 0.0, 0.0, 1.0) для всех источников кроме нулевого, для которого она равна (1.0, 1.0, 1.0, 1.0)
В OpenGL общая, диффузная и зеркальная составляющие света насчитываются отдельно, а затем суммируются.

GL_POSITION - Параметр params содержит четыре целых или вещественных значения, задающих координатный вектор [x, y, z, w], смысл которого определяет значение масштабирующего коэффициента w. Обратите внимание, этот вектор преобразуется видовой матрицей и сохраняется в видовых координатах.
Если компонент w равен 0, то данный источник рассматривается как направленный источник. А диффузное и зеркальное освещение рассчитываются в зависимости от направления, определяемого вектором, соединяющим точку, определяемую тройкой (x, y, z) c началом мировой системы координат. Ослабление заблокировано.
В противном случае, при w = 1, данный источник рассматривается как позиционный. Координатный вектор определяет положение источника света в однородных мировых координатах. Вектор так же преобразуется видовой матрицей и сохраняется в видовых координатах. Параметры освещения рассчитываются на основе действительного расположения источника в видовых координатах, ослабление разрешено. По умолчанию координатный вектор равен [0, 0, 1, 0], что соответствует удаленному в бесконечность источнику света, лучи которого направлены в сторону отрицательной полуоси Z мировой системы координат.

GL_SPOT_DIRECTION - Параметр params содержит три целых или вещественных значения (x, y, z), определяющие вектор направления света позиционного источника в однородных мировых координатах. Направление света источника по умолчанию задается значениями (0, 0, -1). Так же обратим внимание, на то, что этот вектор преобразуется видовой матрицей и сохраняется в видовых координатах. Рассмотрим подробнее смысл этой важного замечания. То есть в момент вызова команды glLight с соответствующими параметрами, формируется координатный вектор, который умножается на матрицу видового преобразования, переводится в видовые координаты и запоминается. Таким образом, положение источника и направление света, подобно геометрическим примитивам, подвергается повороту, переносу и другим геометрическим преобразованиям, накопленным в матрице видового преобразования на данный момент. Матрица проекций не оказывает влияния на эти свойства источника. Используя данный подход, легко сохранять неподвижность источника при движении сцены, или наоборот, организовать движение источника относительно неподвижной сцены.

Включение режима расчета освещения производиться командой glEnable с параметром GL_LIGHTING.



Методические пособия

  • Системы автоматизированного проектирования
  • Социология молодёжи
  • Общая социология
  • Криптография
  • Проектирование трансляторов
  • Компьютерная графика
  • Моделирование систем
  • Информационная безопасность
  • Теория вычислительных процессов
  • Логические основы искусственного интелекта
  • Проектирование распределённых информационных систем