Как с помощью VSL (Visual Shading Language) получить маски теней от источников света. Workflow Realsoft3D > Photoshop

Автор – Дмитрий Осминский. Дизайнер, участник команды бета-тестеров Realsoft3D с 1995 года. Представитель компании RealSoft Graphics OY по России и странам СНГ.

Введение

В этом небольшом уроке мы познакомимся с тем,  как с помощью VSL (Visual Shading Language) получить индивидуальные маски теней от источников освещения и сохранить их в отдельные каналы на рендере. Имея под рукой подобные маски, мы легко можем регулировать освещенность сцены на этапе сборки финального изображения в 2D редакторе. Например, в PhotoShop-е или системе видеокомпозитинга.

3D сцена

Для объяснения принципа работы нашего VSL шейдера нам потребуется создать простую сцену. Не будем ее особенно усложнять.  Используем три аналитических объекта (шарик, кубик, плоскость) и два источника света (Spot light и Point light).

Примечание. Аналитические объекты (Analytic) – представляют собой отдельный тип геометрических объектов ReaLSoft3D. Их отличительная особенность заключается в том, что они представляют собой параметрическую поверхность, задаваемую математической функцией. Для пользователя это тип объектов интерес тем, что очень быстро просчитывается и как все остальные объекты не тесселируется при рендере. Поверхности остаются абсолютно гладкими при любом приближении.

Вот так выглядит наша 3D сцена:

 

Этап 1. Создание новых каналов

Нам потребуется создать несколько новых каналов. Один канал для задания номера источника свет. Назовем его «light_id» (Тип данных – Float Channel) и по одному каналу на каждый источник для сохранения  масок теней. Назовем их «diffuse_shading_1» и «diffuse_shading_2» (Тип данных – Color Channel).

Рис.1. Новые каналы выделены розовой областью.

 

Этап 2. Присвоение уникального номера каждому источнику света.

Нам необходимо сделать так, что бы шейдер умел различать источники света друг от друга. Для этого им необходимо задать уникальные имена. Нам поможет в этом VSL.

Создаем новый VSL Material. Назовем его «light_id_1». Откроем новый материал и активируем режим Advanced. Выбираем VSL Objects > Shader и перетаскиваем иконку на дерево шейдеров. По умолчанию новый шейдер имеет тип Surface Properties. Так, как нам предстоит работать с источниками света, изменим тип шейдера на Light Properties. Должно получится как на рисунке 2.

Рис.2. Шейдер Light Propertits указан стрелочкой

Теперь нам необходимо задать порядковый номер источнику. Выбираем VSL Objects>Constant и перетаскиваем его в шейдер Light Properties. По умолчанию VSL объект имеет выходной канал Color. Поменяем его на канал «light_id_1». Для этого необходимо с щелкнуть правой кнопкой мышки на VSL объекте и в выпавшем меню выбрать Output> и в раскрывшемся списке доступных каналов указать «Light: light_id_1».

Рис.3. Назначаем в качестве Output канал «Light: light_id_1»

Осталось задать значение константы. Раз это первый источник то пусть значение константы будет равное «1». Материал готов. Вот что у нас получилось.

Рис. 4. Готовый материал «light_id_1» выглядит очень просто.

Для второго источника света нам нужен подобный материал, но со значением «light_id» = «2». Для этого продублируем материал «light_id_1» и получившуюся копию назовем «light_id_2».. Откроем его в режиме Advanced и изменим значение константы с «1» на «2-ку».

Нам осталось присвоить полученный материал источнику света. Выбираем в иерархии сцены Point Light и перетаскиваем на него материал «light_id_1». Тоже самое повторяем с источником Spot Light и материалом «light_id_2». В Select Window у нас должна получится такая иерархия сцены (рис.5).

Рис. 5. Источники света с VSL материалом в иерархии сцены.

 

Этап 3. Создание VSL материала для сохранения теней от источников света в отдельные каналы.

Создаем новый VSL материала и назовем его «capture_light_shading». Перейдем в режим Advanced и сделаем новый VSL Shader – Surface Illumination  (это шейдер отвечает за параметры освещенности).

Добавим VSL объект IF c Input каналом> Surface:Recursion. Параметры настройки: тип –«IF», Sub1- «if less», Lower –1,01.

Внутри объекта IF новую переменную. Назовем ее «sameside». Тип данных – Float

Она нам необходима для определения с какой стороны находится источник света относительно поверхности.  

Для вычисления значения канала «sameside» нам потребуется VSL Objects>Operation с настройками

     Output канал – «sameside»
     Input0 канал – «Surface:Ray*Normal»
     Input1 канал – «Light:Ray*Normal»
     Operation (тип операции) – multiply (умножение)

В конечном виде эта строка шейдера выглядит так:

     Sameside (Output канал) = multiply (Surface:Ray*Normal(Input0 канал), Light:Ray*Normal(Input1 канал))

После определения значений канала «sameside» мы будем использовать его в дальнейших вычислениях шейдера.

Создадим еще один VSL объект IF c параметрами

     Input каналом> sameside.

Параметры настройки: тип –«IF», Sub1- «if greater», Lower –0,00.

Внутри объекта IF создаем новую переменную. Назовем ее «ilm» (Тип данных - Color)

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

Произведем ее вычисление при помощи уже знакомого нам VSL Objects>Operation.

Строка шейдера будет иметь такой вид

     ilm (Output канал) = abs(dot product (Light:Ray (Input0 канал), Surface:BumpNormal (Input1 канал)))

Так как нас интересует только положительные значения, мы добавили General> Operation>abs

Теперь у нас все готово для вычисления освещенности для каждого источника света и записи этих данных в отдельные каналы.

Создадим еще один VSL объект IF c параметрами

     Input каналом> Light:light_id

Параметры настройки: тип –«IF», Sub1- «if inside», Lower –0,5, Upper–1,5.

При помощи этой строки, мы указываем шейдеру с каким источником света в данный момент он будет работать. Выбор происходит по значению канала light_id, который мы определили ранее при помощи VSL материалов «light_id_1» и «light_id_2».

Внутри созданного IF объекта мы сейчас будем вычислять маску освещенности от точечного источника света «light_id_1» при помощи VSL Objects>Operation.

Строка шейдера будет иметь такой вид

     diffuse_shading_1 (Output канал) += multiply (ilm (Input0 канал), Light:illumination  (Input1 канал)))
     Output канал – «Surface:diffuse_shading_1»
     Input0 канал – «ilm»
     Input1 канал – «Light:Illumination  »

Для второго источника света нам необходимо сделать такое же вычисление, но с изменением  каналов. Что бы не тратить времени на написание кода мы продублируем строку шейдера объекта IF (клик правой кнопкой на объекте открывает выпадающее меню и в нем выбираем Dublicate) вместе с вложением. Выполним изменения каналов

Для IF установим   - Lower –1,5, Upper–2,5

Для Operation в качестве Output канала укажем «Surface:diffuse_shading_2»

На этом работа с шейдером закончена. Наш материал «capture_light_shading» должен иметь вот такой вид (рис.6)

Рис.6 Окончательный вид VSL кода для материала  «capture_light_shading».

 

Этап 4. Вывод каналов «diffuse_shading_1 и diffuse_shading_2» на рендер.

Realsoft3D может использовать для рендера практически все популярные графические форматы. Кроме этого RealSoft сохраняет все каналы за один проход рендера, что существенно экономит время.

Сейчас мы воспользуемся этой возможностью для каналов «diffuse_shading_1» и «diffuse_shading_2».

Откроем раздел Output objects и правым щелчком мышки откроем меню. Нам нужен раздел New. При наведении на него курсора справа появиться список доступных форматов. Выберем Photoshop и добавим его к списку приформатов рендера (рис.7).

Рис.7. Последовательность действий созданий пресета сохранения данных в формат Photoshop-а.

Примечание. Формат Photoshop-а удобен тем, что позволяет в одном файле сохранять сразу несколько масок. Как раз то что нам нужно.

Только что мы создали preset формата PSD. Теперь нам нужно выполнить его конфигурацию, что бы он сохранял каналы «diffuse_shading_1» и «diffuse_shading_2»

Двойным щелчком (можно нажать клавишу “P” ) откроем настройки (Property Window) пресета. Для начала переименуем его переименуем его в “LightMask to PSD”, так легче нам будет ориентироваться если подобный пресетов несколько (например, когда мы работаем с библиотекой пресетов).

Сейчас настройки нашего пресета выглядят как на рис8.

Рис.8. Так выглядит пресет PSD по умолчанию

Перед нами настройки «по умолчанию» для сохранения результатов рендера в формат Photoshop-а. Это значит, что RealSoft будет создавать PSD файл глубиной цветности 8Bit на канал, в файле будет присутсвовать Alpha канал и один Layer – Background. RGB составляющие канала  цвета Color RealSoft-a сохраняются как RGB каналы Photoshop-а на Background Layer. Все просто.

Начнем конфигурировать пресет под нашу задачу. Уберем галку с Alpha канал – он в нашем случаи не нужен. Щелкним правой кнопкой мыши на окне Layer и в выпадающем меню выберем New. Мы создали новый Layer в PSD файле. Вызовем еще раз выпадающее меню и при помощи Rename- переименовываем Layer00 в Light_id1. Таким же образом создаем еще один Layer и называем его Light_id2. На этом этапе мы можем присваивать любые имена, главное что бы было понятно.

Пришло время приступить к настройке каналов. Я думаю, уже понятно что нам надо указать соответствие каналам RealSoft-та RGB каналам уровней Photoshop-а.

Для этого активируем Edit Bindings. Появились два новых окна. Смотрим на рис.9.

Рис.9.  Через Source и Destination мы устанавливаем как будут сохраняться результаты рендера в структуру файла Photoshop-а.

Верхнее Source содержит все субканалы RealSoft-та. Нижнее Destination – все свободные уровни Photoshop-а с каналами цвета. Нам осталось только указать, что и куда сохранять. Выбираем в окне Source субканал «diffuse_shading_1:R» (субканал красного цвета) и в окне Destination «Light_id1:R» (красный канал уровня Light_id1). После этого кнопка Add станет активна. Нажимаем ее. В окне Channel Bindings Добавилась строка diffuse_shading_1:R-> Light_id1:R. Проделаем то же самое с субканалами G/B канала diffuse_shading_1. Сохранение маски первого источника света у нас подготовлено. Повторим действие с каналалом diffuse_shading_2 и Light_id2.

В результате мы должны получить вот такой пресет для PSD формата (рис 10).

Рис. 10. Окончательный вид пресета PSD файла.

Примечание. На самом деле, так как мы работаем с масками, то вполне достаточно было сохранить по одному субканалу (например, R) из каналов diffuse_shading_1 и diffuse_shading_2. Мы не стали пока этого делать из желания получить более наглядный для понимания файл Photoshop-а. В реальной работе, конечно, совсем не обязательно каждую маску сохранять во все каналы уровня PSD файла. Можно обойтись одним цветовым каналом для каждой маски.

 

Этап 5. Рендер.

Самый простой подраздела этого урока :-). В меню выбираем File>Render (или нажимаем, Ctrl+r). В появившемся окне File Render находим Output>Available Formats и в списке доступных пресетов форматов выбираем “LightMask to PSD” (это то самый, который мы только что создавали). Устанавливаем все остальные настройки и нажимаем, по вкусу, Render Image или Render Animation. После окончания рендера открываем результат в Photoshop-е и видим желаемые маски освещенности от каждого источника света (рис 11).

Рис. 11. Так выглядят маски источников света в PSD файле

 

Эпилог

В уроке мы рассмотрели создание только двух каналов. В реальной работе может потребоваться больше – AO, bumpNormal, diffuse_Color, Specular Illumination ,Transparent, Distance (camera Z-buffer), Reflection, User Mask и т.д. Познакомившись с возможностями VSL, вы можете самостоятельно и быстро это сделать. Самое главное, RealSoft, как мы убедились позволяет выводить множество каналов за один проход рендера. Т.е там, где раньше приходилось применять мультипроходный рендер, теперь мы можем делать это за один раз. А значит существенно сэкономить свое время. 

Всем удачи :-)

С уважением Дмитрий Осминский

211 0 850 15
5
2008-12-03
ой... им ещё кто то пользуется??? :)
2008-12-04
Грех не пользоваться, когда такая мощь под руками [smile=13]
2008-12-05
Дмитрий, хороший урок. Продолжайте. И оживите наконец реалсофт.ру.:)
2008-12-08
2 ODA: Решпект до небес и благодарность. Спасибо огромное за урок. ОЧЕНЬ актуально. 2 Skif: Не просто "кто-то еще пользуется", а возвращаются к нему, после, например, Cinema 4D или даже Houdini. Не потому что последние два пакета плОхи или чем-то уступают R3D. И не потому что их не получилось освоить. Просто в Realsoft есть уникальные фишки. И концентрация этих фишек и смелых решений необычайно велика. И еще. Это очень сбалансированный и самодостаточный пакет. Хотя и не простой во-многом.
2010-12-01
Очень хороший и полезный урок. Как то я его пропустил.
RENDER.RU