Управляем параметрами света при помощи VSL

Этот урок покажет Вам, как создать и изменить освещение поверхностей, используя возможности VSL. Я написал его предполагая, что Вы никогда не "залезали" глубоко в математику, которую я привлек, и поэтому он является идеальным для новичка.

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

VECTORS (векторы)
Вы наверное уже представляете себе что такое XYZ пространство и и что такое система координат. Теперь давайте вспомним что такое вектор. Вектор - способ описывающий направление в XYZ пространстве. Еще одной особенностью векторов, является то, что они могут описать расстояние или длину. При рассмотрении направлений используется "единичный вектор ", что означает, что длина этого вектора - всегда равна 1, так что 1,0,0 был бы единичным вектором для положительной оси X в пространстве. Вектор 1,1,0 - не является единичным вектором, потому что его длина больше чем 1 (фактически около 1.41). Так что вектор может описать направление и расстояние, но единичный вектор только описывает направление, и его длина - всегда равна 1.

SURFACE NORMALS (нормаль к поверхности)
Для любого точки на любом объекте в сцене "нормаль" - это направление (вектор), указывающее непосредственно от поверхности. Если бы нашей поверхностью была плоскость XZ плана, тогда нормалью всегда была бы ось Y. Нормаль - это всего лишь вектор, который направлен от поверхности. Обратите внимание, bump mapping работает изменяя нормаль для данного точки поверхности, так что при этом происходит изменение угола к свету, и поэтому при шейдирование создает впечатление неровности.

DOT PRODUCT (результат сложения/умножения 2-х векторов)
Для любого источника света в нашей сцене световые лучи имеют направление (вектор). Так что, мы теперь имеем два направления, луч света и нормаль к поверхности. Стандартный методом вычисления яркости освещения поверхности, является вычисление угла между этими двумя векторами и измерение количества света согласно полученному результату.

tut01.gif (4190 bytes)

Представьте себе, что вы являетесь источником света, смотрящим на сферу. Самый центр сферы будет ярко освещен, но чем дальше вы будете удаляться от центра сферы тем она будет выглядеть менее яркой. В центре сферы нормаль к поверхности направлена непосредственно на вас, так весь свет, который вы излучаете на сферу, будет отражаться прямо назад к вам. Передвигаясь дальше от центра, нормаль начинает указывать все дальше от вас пока на самом краю, угол не достигнет значения 90 градусов и в этой точке, никакой свет не будет отражаться назад.
Таким образом мы рассмотрели процесс рассеянного освещения. Возвратившееся количество света уменьшилось обратно пропорционально к углу между нормалью и световым лучом. Поэтому первым шагом в нашем расчете освещения будет измерить этот угол, и для этого мы должны использовать результат сложения двух векторов...
Результат сложения двух векторов фактически дает вам косинус между двумя векторами и может только изменяться в пределах 180 градусов. Результат сложения двух векторов (при использовании единичных векторов) - всегда в пределах от - 1 до 1. Если результат -1, эти два вектора направлены в противоположные стороны, если результат - 0, то векторы располагаются под углом 90 градусов, если результат равен 1, то направление векторов совпадает.


DOT PRODUCT = 1

DOT PRODUCT = -1

DOT PRODUCT = 0

Результат сложения двух векторов фактически дает вам косинус между двумя векторами и может только изменяться в пределах 180 градусов. Результат сложения двух векторов (при использовании единичных векторов) - всегда в пределах от - 1 до 1. Если результат -1, эти два вектора направлены в противоположные стороны, если результат - 0, то векторы располагаются под углом 90 градусов, если результат равен 1, то направление векторов совпадает.

Я добавил шейдер surface properties, чтобы установить цвет поверхности как серый (0,5 0,5 0,5), так чтобы потом было легче видеть изменение эффекта.
В шейдер surface illumination создадим две переменные:
LightAngle используется, чтобы сохранять результат операции сложения двух векторов.
MyIllum используется, чтобы сохранять яркость объекта, в зависимости от угла.


Далее мы получаем результат сложения двух векторов рассчитываемый между вектором светового луча и вектором нормали к поверхности. Я использовал bump нормаль на тот случай если другие шейдеры создают bump mapping.
Оператор IF используется, чтобы определить необходимую нам сторону поверхности. Если LightAngle - меньше 0, тогда операторы внутри IF выполняются. Вы можете задать себе вопрос, почему освещение рассчитывается, только если результат сложения двух векторов - меньше 0, когда ранее я сказал, что величина между -1 и 0 - это, когда векторы направлены друг от друга. Это - так, потому что вектор для света напрвлен к свету, а не от света, он напрвлен в другом направлении. Напомним, что метод ray tracer просчитывает обратный ход луча
Первый оператор внутри IF, устанавливает обсолютное значение для переменной LightAngle в диапазоне от 0 до 1.
Второй оператор multiple, вычисляет яркость объекта, основанную на его цвете и значении LightAngle и сохраняет результат в переменную MyIllum.
Третий оператор добавляет переменную MyIllum к общему значению освещенности поверхности Illumination. Это используется в двух целях. Во-первых цвет света теперь рассматривают в уравнении, и во-вторых тени и свойства света так же учитываются. Результат ДОБАВЛЯЕТСЯ в канал Illumination. Очень важно выполнить добавление "+" результата к каналу, а не просто его присвоить как "=", в таком случае мы учитываем влияние других шейдеров и источников света используемых в сцене на нашу поверхность.

Наконец, мы вернулись за пределы оператора IF, и установим Light: Illumination на 0,0,0. Это фактически выключает свет, так что бы стандартные RealSoft3D шейдеры не имели никакого дальнейшего влияния на наш шейдер.


Теперь мы готовы добавить оператор Сurve, который позволит нам управлять значением LightAngle, и таким образом "формировать" необходимый эффект освещения. Оператор нужно добавить внутри оператора IF, следующим образом:
Входной и выходной параметр для опрератора Сurve должны быть установлены какLightAngle, а минимальный/максимальный диапазон будет от 0 до 1 по обеим осям.
Кривая оператора Сurve может теперь быть отредактирована, чтобы управлять зависимостью в которой угол определяет яркость поверхности.

Если Вы добавляете точку в середине кривой и затем перемещаете ее вверх, то область тени на поверхности будет уменьшаться. Если Вы переместите новую точку вниз к оси Х, то область тени будет больше и менее размытой. Передвижение точки вверх будет давать поверхности подобные камню, а перемещение ее вниз будет лучше для металлических поверхностей. Удаление точки возвращает линейную зависимость, и наш шейдер будет вести себя точно так же как шейдер используемый "по умолчанию"

Вы можете загрузить пример шейдера здесь.

Внизу приведены несколько примеров, показывающих как от формы кривой меняется область тени поверхности:







Урок любезно предоставлен Andy Jones. Любые вопросы и пожелания по этому уроку пишите на адрес andy@pxl8.co.uk

Перевод компании "Graphic Group" (e-mail: grapgr@dol.ru), декабрь 2002
0
RENDER.RU