На данный момент в HydraRender поддерживаются следующие виды источников:
-
Точечный (Omni-directional)
-
Направленный (Directional light)
-
Прожекторный (spot)
-
Небесный свод (Sky light, environment light)
-
Площадный (Area light)
-
Сферический (Sphere light)
Источники света в виде произвольных мешей задаются через свойства материала emissive.
Почему свет от источников затухает?
Для всех источников света, имеющих реальную мировую позицию (точечный, прожеторный, площадный, сферический, произвольный меш) можно задавать параметры затухания света с расстоянием. Концепция затухания света для этих источников очень важна и имеет непосредственно отношение к физической корректности источника. И это не имеет никакого отношения к затуханию света в непрозрачной среде (такой как туман например). Для соблюдения физической корректности источников света (за исключением spot light, про который мы будем говорить отдельно), интенсивность света от источника должна убывать квадратично с расстоянием до источника. Этот закон вытекает из соображения, что количество энегрии падающее в точку от источника будет пропорционально его угловому размеру по отношению к этой точке, что в свою очередь обратно пропорционально квадрату расстояния от источника до этой же точки. Однако, при вычислени вторичного освещения (диффузно или зеркально переотраженный свет) такое затухание не учитывается, почему?
Все дело в том, что при вычислении отраженных лучей квадрат расстояния получится сам собой, за счет того, что в далеко стоящие объекты попадет меньше лучей, чем в близко стоящие - есть прямое моделирование. Однако поскольку некоторые источники вообще не имеют размера, или имеют маленький размер, но при этом они очень яркие, моделировать их таким образом невозможно. По этой причине источники света обычно сэмпляться детерминированно (то есть мы считаем затенение и трассируем теневые лучи при каждом новом шаге рекурсии), то для того чтобы все-таки получить правильный результат искуственно домножают на коэффициент затухания.
Вот формула используемая в рендере для учета затухания от источника света.
Рисунок 1. Формула, учитывающая затухание света.
kc рекомендуется всегда ставить в единицу, т.к. это гарантирует неувеличения значения освещенности вблизи источников.
Трансформации
Для источников существует один неочевидный момент, который необходимо рассмотреть - это трансформации и положение источника в мировом пространстве. Источники света импортируются как из COLLAD-ы, так и из плагина HydraRender для 3DS max. Если вы работаете с плагином, то:
1. Все трансформации должны передаваться корректно, но:
2. Вы можете тем не менее использовать COLLADA profile и указать другие трансформации если что-то не так. В этом случае позиция источника (а также размер и ориентация если они есть) будут определяться исключительно заданными в COLLADA profile трансформациями. Далее, касательно трансформаций:
1. Они примиеняется в порядке, обратном тому, в котором они записаны (как в OpenGL если вы с ним знакомы). В приведенном ниже примере Сначала применяетс rotate а затем translate. Это соответствует стандарту COLLADA. То есть если вы сначала записываете преобразование translate а затем rotate, то финальное преобразование будет соответствовать матрице преобразования MTransform = translate*rotate; что в свою очередь сооветствует применению rotate а затем translate (т.к. согласно более распространенному стандарту мы умножаем матрицы на точки, а не точки на матрицы).
2. В параметре rotate первые 3 числа - вектор, относительно которого будет производится поворот. Четверное число - угол в градумах, на который нужно повернуть объект.
Теперь, если вы импортируете сцену через COLLADA то там трансформации будут записаны в разделе "library_visual_scenes".В этом случае прописывать напрямую в теге light преобразования нельзя - все преобразования, записанные у источника будут игнорироваться. Если вы хотите поменять положение источника, его следует менять в разделе library_visual_scenes файла в формате COLLADA, либо описать этот источник в отдельном COLLADA профиле. В последнем случае будут использоваться трансформации указанные там.
В отличие от работы с материалами, в случае возникновения проблем, мы не советуем вам исправлять файлы COLLADA вручную. Лучше пользоваться механизмом COLLADA профилей, где все будет описано в одном месте. Так вы гарантированно не запутаетесь.
Примеры
Тотчечный источник света
Это самый простой тип источников. Вот пример его описания.
<light id="MyLight" name="MyLight">
<translate sid="translate">0.0 45.354244 -20.0</translate> <general> <type> Point </type> </general> <intensity> <color>1 1 1</color> <multiplier> 15 </multiplier> </intensity> <constant_attenuation> 1.0 </constant_attenuation> <linear_attenuation> 0.0 </linear_attenuation> <quadratic_attenuation> 0.5 </quadratic_attenuation> </light>
Рисунок 2. Точечный источник.
Направленный источник света
У направленного источника света 2 важных отличия. Во-первых, направленный источник света обычно не имеет затухания. Несмотря на это, вы можете указать коэффициенты затухания в соответствующих тегах, однако это сделает ваш источник физически неправильным. Вторая важная особенность направленного источника - собственно его направление. Оно задается 3 различными способами.
1 - напрямую тегом "direction".
2 - задать преобразование поворота. По умолчанию (если тег direction) отсутствует направление источника всегда (0, -1, 0). Преобразование поворота можно применять даже если тег direction есть.
3 - задать некую точку в теге "look_at". В этом случае иточник будет смотреть на эту точку.
Все 3 пункта касательно задания направления верны также и для площадных источников.
<light id="MyLight" name="MyLight"> <general> <type> Directional </type> </general> <direction> 4 2.99 6 </direction> <intensity> <color>1 1 1</color> <multiplier> 5 </multiplier> </intensity> </light>
На приведенном ниже скриншоте сцена освещается одним отчечным и одним направленным источником.
Рисунок 3. Точечный и направленный источники.
Прожекторный источник
Данный тип источник имитирует точечный прожектор.
<light id="Spot01-lib" name="Spot01Mesh"> <translate sid="translate">-56.844547 58.973194 -79.832260</translate> <look_at sid="look_at">0 0 0</look_at> <general> <type> spot </type> </general> <falloff_angle sid="angle">10.099983</falloff_angle> <falloff_angle2 sid="angle">46.099983</falloff_angle2> <falloff_power sid="angle">1.0f</falloff_power> <falloff_power2 sid="angle">2.0f</falloff_power2> <intensity> <color> 0.678431 0.678431 1.000000 </color> <multiplier> 4.0 </multiplier> </intensity> <constant_attenuation> 1.0 </constant_attenuation> <linear_attenuation> 0.1 </linear_attenuation> <quadratic_attenuation> 0.001 </quadratic_attenuation> </light>
Рисунок 4. Прожекторный источник.
Skilight
Иточник света, имитирующий рассеянное дневное освещение. Параметры затухания для него так же не имеют смысла.
<light id="Sky01-lib" name="Sky01Mesh"> <general> <type> Sky </type> </general> <intensity> <color> 0.678431 0.678431 1.000000 </color> <multiplier> 2.5 </multiplier> </intensity> </light>
Рисунок 5. Skylight создает эффект "Ambient occlusion".
Area Light
Для площадного источника помимо размера, затается дополнительно параметр спадения интенсивности света - faloff_power. Известно, что в направлениях, не коллинеарных нормали площадного источника интенсивность спадает по косинусу. Однако, для большей гибкости мы предоставляем возможность регулировать этот параметр. Для нормальных площадных источников задавайте этот параметр равным 1.
<light id="MyCustomLight" name="MyCustomLight">
<translate sid="translate">0.0 50.354244 -20.0</translate> <rotate sid="rotate">1.0 0.0 0.0 45.0</rotate> <general> <type> Plane </type> </general> <intensity> <color>1 1 1</color> <multiplier> 20 </multiplier> </intensity> <size> <Half-length> 16.236 </Half-length> <Half-width> 15.129 </Half-width> </size> <falloff_power>1.0f</falloff_power> <constant_attenuation> 1.0 </constant_attenuation> <linear_attenuation> 0.0 </linear_attenuation> <quadratic_attenuation> 0.3 </quadratic_attenuation> </node>
Рисунок 6. Area Light. falloff_power = 1 (дефолтное значение).
Для площадных источником можно задавать параметр faloff_power. Это степень косинуса, по которой падает интенсивность по отношению к нормали. Как правило лучше этот параметр всегда указывать равным 1. Однако, если вы хотите сделать площадный прожектор, светящий более направленным светом, вам сожет пригодиться этот параметр.
Рисунок 7. Area Light. falloff_power = 2.
Рисунок 8. Area Light. falloff_power = 4.
Spherical light
Светящаяся сфера.
<light id="MyLight" name="MyLight">
<translate sid="translate">0.0 45.354244 -20.0</translate> <general> <type> Sphere </type> </general> <intensity> <color>1 1 1</color> <multiplier> 15 </multiplier> </intensity> <size> <radius> 5.0 </radius> </size> <constant_attenuation> 1.0 </constant_attenuation> <linear_attenuation> 0.0 </linear_attenuation> <quadratic_attenuation> 0.5 </quadratic_attenuation> </light>
Рисунок 9. Spherical Light.
Для источников света, имеющих определенный размер - Area light и spherical light. Существуют еще 2 дополнительных параметра - флажка. Их значения должны быть равны 0 или 1.
<fast_shading> 0 </fast_shading> <add_as_geometry> 1 </add_as_geometry>
1. Параметр add_as_geometry по умолчанию равен 1. Он говорит, нужно ли добавлять источник в сцену как геометрический объект. Если установить этот параметр в 0, источник света будет невидимым.
2. Параметр fast_shading ускоряет шейдинг за счет того, что считает затенение от точки, находящейся в геометрическом центре источника. При этом тень считается правильно. В некоторых случаях, особенно для сферических источников света, этот параметр может ускорить рендеринг, однако результат будет не совсем корректным. В общем случае не рекомендуется изменять значение этого параметра (по умолчанию = 0). |