пятница, 29 марта 2013 г.

Native IBL in 3ds max. Алгоритм для ленивых

Одним из алгоритмов существующих в Mental Ray является environment lighting mode (режим освещения при помощи окружения), который больше известен как Native или Built-in IBL. Этот алгоритм в составе Mental Ray был представлен в версии 3.7 около 4 лет незад. К сожалению единственным способом доступа к этой и другим "новым-старым" функциям в среде 3ds Max были String Options, используя команды которых Artur Leao и Thorsten Hartmann написали соответствующие макроскрипты. Но как заявляют наши друзья из Autodesk по связям с общественнoстью Sneak и Peek 3ds max 2014 станет первым релизом, за уже долгое время, начиная с которого интеграция Mental Ray в 3ds Max улучшиться. Как видим в 2014 версии наконец-то интегрирован Native IBL о котором поговорим сегодня , Unified Rasterizer/Scanline и  Unified Sampling о котором говорилось ранее. 

И так, Native IBL:


Какие преимущества в использовании Native IBL?

По просту говоря, это быстрый алгоритм который автоматически освещает сцену прямым светом, где в основном, в качестве источника света используются изображения с высоким динамическим диапазоном (HDRI)


Попробуем воссоздать приведенные выше изображения.


Для создания нам потребуется:

Шейдеры из библиотеки Production Shaders, а именно:

  1. Environment/Background Switcher
  2. Environment/Backgroung Camera Map
  3. Материал Matte/Shadow/Reflection
Изображение с высоким динамическим диапазоном (HDRI). И если уж приобретать, то я рекомендую HDRI packs подобные тем что можно найти на сайте www.myhdri.com по трем причинам:


  1. НDR изображения высокого разрешения (14000x7000px) которые сгенерированы при помощи 14 снимков с разной экспозицией. (Папка HDRI)
  2. 1 образец + 12 фотографий фона высокого разрешения (5181х3456px 16bit TIF).  (Папка Backplates) 
  3. Местоположения камер относительно фотографий фона в этих сборках сохранено в формете FBX и не требует подгонки виртуальной камеры. Так же в файле присутствует контрольный куб с размером 120*120*120см.  (Папка Cameras) 
* Для данного примера скачаем с сайта  www.myhdri.com  демонстрационную сборку HDR изображения Free Sample Pack.



Собираем окружение.

В слот Environment Map диалогового окна Environment and Effects устанавливаем шейдер Environment/Background switcher и копируем его в Material Editor в режиме Instance.

В слот Background устанавливаем шейдер Environment/Background Camera Map, в котором устанавливаем в слот на котором написано "Browse" файл  фотографии фона IMG_6721.tif, который находится в папке Backplates.Так как  Environment/Background Camera Map это шейдер mental ray  интегрированый в среду 3ds max, то наш фон в слот "Browsе" загрузится напрямую, а не при помощи карты Bitmap. Это означает что 3ds Max не настроит автоматически гамму загружаемого изображения в соответствии с гаммой рабочего пространства. В итоге, в шейдер  Environment/Background Camera Map наш фон установится уже с компенсированой гаммой 2.2 (если только это не изобразение в 32 битном формате сохраненное с гаммой 1.0). А так как гамма рабочего пространства 3ds Max также выставлена на 2.2, то наш задник загрузится с сумарной гаммой которая будет равна 2.2+2.2 = 4.4. Чтобы компенсировать гамму нашей текстуры, установим значение Reverse Gamma Correction = 2.2. В принципе нашу текстуру фона, при помощи карты Bitmap, можно было установить напрямую в слот Background шейдера Environment/Background Switcher, но о том для чего сделанно имено так, как описано выше мы поговорим чуть позже.

Далее в слот Environment/Reflection,  из папки HDRI,  при помощи карты Bitmap загрузим нашу HDRI карту. Убедимся что отключена галочка Use Real-World Scale, тип мапинга выбран Еnviron и в выпадающем меню выбран Spherical Environment.




На данном этапе, мы столкнулись со следующей проблемой. Несмотря на то что 3ds max отлично отображает бэкграунды во вьюпортах, если мы выберем режим отображения фона Environment Background, то увидим что 3ds Max не в состоянии отображать сложные шейдеры в слоте  Environment Map свитка Environment and Effects.




Для отображения нашего фона в окне проекции мы можем использовать Сustom Image File. Проблема с этим методом заключается в том что если в диалоговом окне Viewport Configuration мы просто загрузим наш фон ( IMG_6721.tif) с оригинальным разрешением, который весит более 100мб, мы заметим что при переключении или увеличении/уменьшении окон проекции мы сильно потеряем в производительности. Задержки между переключениями могут быть от 5 сек и выше. Связано это с тем что при использовании этого режима 3ds Max загружает копию этого изображения каждый раз когда вы переключаете или увеличиваете/уменьшаете окна проекций. По словам разработчиков когда разрабатывалась это функция, то она не предусматривала использования столь "тяжелых" изображений. Поэтому для того чтобы не терять в производительности, создаем в фотошопе "легкую" копию нашего задника с небольшим разрешением.

Настраиваем окружение.

Импортируем из папки Cameras файл "Camera_120624_101.fbx". установим вид из камеры с именем "IMG_6721". Удалим куб Object001, а на его месте создадим высокий цилиндр и создадим под ним плоскость плоскость Plane и присвоим ей имя Matte_Object. Присвоим оъектам  Cylinder001 и Matte_Object материал  Arch&Design  белого цвета на основе пресета Matte Finish с именем Test.  Установим в сцену источник света Skylight и выберем Use Scene Environment. На данном этапе наша сцена должна выглядеть так:






Так, как в 3ds max 2014 режим Native IBL включен по умолчанию, то мы сразу же можем выполнить настройку экспозиции. Заходим в диалоговое окно Environment and Effects, в свитке Exposure Control выбираем mr Photographic Exposure Control и включаем галочку Process Environment and Background Maps. В свитке mr Photographic Exposure Control выбираем пресет Non Physicaly Based Lighting и жмем кнопку Render Preview. После того как будет выполнена визуализация, выставляем значение Exposure Value так, чтобы яркость нашего задника приблизительно соответствовала оригинальной фотографии как показано на рисунке.





Настраиваем IBL.

Выполним рендер сцены.




Как видим результат далек от желаемого:
  1. положение нашей HDR карты не соответствует фону (тень от цилиндра отбрасывается в другую сторону).
  2. Наша HDR карта, по умолчанию, обладает не достаточно контрастной интенсивностью. (очень не резкая тень по сравнению с фоном. Белые плоскость и цилиндр имеют синий оттенок если сравнивать с белой полосой разметки).

Для того чтобы выставить местоположение HDR карты относительно задника выберем ее в Material Editor и в свитке Coordinates выставим значение Offset U: равное 0.1. Это значение получено опытным путем, делая быстрые рендеры.

Для того чтобы увеличить контрастную интенсивноть HDR карты нам нужно отделить ее от отражений. А так как сама HDR карта обладает нормальной яркостью относительно фона, нам не нужны пересвеченые отражения на отражающих поверхностях. Для этого выберем наш Skylight, переключим его в режим Sky Color и в слот None установим шейдер Gamma&Gain, который скопируем в Material Editor в режиме Instance. Далее, в шейдере Gamma&Gain, в слот Input скопируем  в режиме Instance  из шейдера Environment/Background switcher нашу HDR карту находящуюся в слоте Environment/Reflections.





Изменяя параметр Gamma в шейдере Gamma&Gain, теперь у нас есть возможность регулировать контраст НDR карты отвечающей за освещение независимо от HDR карты отвечающей за отражения. Но как определить необходимое значение?  Так как Matte_Object располагается в одной плоскости с дорогой, сравним яркость белых пикселей дорожной разметки и я яркость пикселей белого материала  Matte_Object, которые находятся ближе всего к друг другу, в окне Virtual Frame Buffer.  Сделаем рендер нашей сцены. Удерживая правую кнопку мыши в нужных местах сравним значения пикселей:





Делая тестовые рендеры, регулируем параметр Gamma в шейдере Gamma&Gain, пока не добьемся одинакового значения пикселей в этой области  с приблизительной точностью до одной десятой. В моем случае, значения пикселей сравнялись при параметре Gamma равым 1.805. Если теперь мы в материале Test изменим белый цвет на приблизительный цвет грунта задника, то мы увидим что наша сцена настроена абсолютно правильно. освещение наших объектов соответствует освещению фона, цвет и направление теней совпадает с тенями фона.


Удаляем Сylinder001 и вставляем в сцену модель которую необходимо визуализировать

Настраиваем материал Matte/Shadow/Reflection.

Материал  Matte/Shadow/Reflection  используется при создании объектов заменителей фона, которые повторяют реальные объекты на фотографиях использующихся в качестве фона. В нашей сцене таким объектом является Matte_Object. Создадим в Material Editor  Материал  Matte/Shadow/Reflection и присвоим его данному объекту. Вот здесь и всплывает на поверхность ответ на вопрос для чего мы в качестве фона использовали шейдер  Environment/Backgroung Camera Map. Дело в том что если сейчас при помощи карты Bitmap, в слот Camera Mapped Background  мы загрузим фотографию нашего фона, то то такой подход не будет работать правильно при создании отражений на "глянцевых" объектах. Это связано с тем что, Screen Mapping карты Bitmap просто берет пиксель из текстуры основываясь на координатах пикселя который в данный момент рендерится. Для того чтобы объекты получали нормальные отражения, скопируем  в слот Camera Mapped Background в режиме Instance  из шейдера Environment/Background Switcher нашу карту фона созданную с использованием  Environment/Backgroung Camera Map находящуюся в слоте Background. Что нам это дало? Теперь объекты получают нормальные отражения и если нам нужно будет заменить текстуру фона в шейдере Environment/Background Switcher, то она автоматически заменится и в материале  Matte/Shadow/Reflection. 

Финальные настройки.

В 3ds Max 2014, в диалоговом окне Render Setup, во вкладке Global Illumination добавился свиток Skylights & Environment Lighting (IBL) который отвечает за Image Based Lighting (освещение на основе изображения)




Skylight Illumination from Final Gather (FG) - естественное освещение генерируется при помощи алгоритмов Final Gathering

Skylight Illumination from IBL - (по умолчанию) Естественное освещение генерируется на основе карт окружающей среды (Environment Map).

Shadow Quality - устанавливает качество генерируемых теней. Чем выше значение, тем дольше происходит процесс визуализации и тем выше качество генерируемых теней. При использовании изображений с динамическим диапазоном высокого качества достаточно значений в пределах 0.3 - 0.5

Shadow Mode:
  • Transparent (More Accurate) - (по умолчанию) Тени физически корректны, но дольше визуализируются
  • Opaque (Faster) - Тени для всех объектов не прозрачные, в том числе для прозрачных объектов. Физически не корректны, но быстрее визуализируются

В нашем примере в свитке Skylights & Environment Lighting (IBL)  я использовал настройки по умолчанию, лишь увеличив параметр Shadow Quality до 0.5. так же использовался  Final Gather и пресет Draft c четырьмя диффузными отражениями для вторичных отражений. в качестве сэмплинга использовался Unified Sampling с параметром Quality = 2.5, Minimum = 1, Maximum = 200, фильтр Gauss с размерами 3.0x3.0. Так же в настройках mr Photographic Exposure Control были изменены следующие параметры (настраиваются по вкусу): Highlights (Burn) = 0.63, Midtones = 0.56, Shadows = 0,74, Vignetting = 15. В итоге, на выходе я получил вот этот рендер:





Почему нельзя осветить сцену используя лишь Final Gather?

Можно, но Final Gather сэмплирование распространяет лучи несколько беспорядочно. Отсюда вытекает несколько очевидных проблем:

  • Световые пятна. Final Gather будучи схемой основаной на интерполяции требует высокой точности для расчета качественного освещения.
  • Слишком мягкие тени. Вам понадобится слишком высокая точность для того чтобы тени выглядели правильно.
  • Сложные HDR изображения или  HDR изображения с высоким контрастом требуют слишком тонкой настройки.

Так как Native IBL это метод на подобие Brute Force, то для того чтобы достичь такого качества используюя лишь  Final Gather потребовалось бы гораздо больше времени на визуализацию.

Возможно ли совмещать IBL и Final Gather?

 Да, причем настройки Final Gather можно использовать с минимальными настройками. Но не забывайте, что вам возможно придется использовать FG Noise Filtering если световые блики на объектах расположеных близко к камере слишком яркие и генерируют световые пятна при использовании Final Gather.

Так же стоит обратить внимание на то, что по умолчанию Arch&Design материалы не генерируют прямое отражение (direcr reflections) от видимых объемных источников света (галочка Visible area lights cause no Highlights в свитке Advanced Rendering Options). Это значит, что при использовании Render Elements, Specular Pass для  Arch&Design материала может оказаться пустым, так как для его генерации используются непрямые отражения (indirect reflections) для сэмплирования окружающей среды. Так как прямое сэмплирование источника света окружающей среды менее эффективно, то шейдеры которые используют этот метод (например Car Paint) могут генерировать шум. Чтобы избавится от него нужно увеличить настройки Unified Sampling или с меньшей потерей производительности увеличить параметр Quality IBL (доступен через свиток String Options или скрипты  Artur Leao и Thorsten Hartmann которые доступны пока только до 2013 версии)

На заметку:


  • HDR изображения с не высоким динамическим диапазоном не будут генерировать резкие и глубокие тени.
  •  HDR изображения с несколькими источниками света будут автоматически генерировать тени от них. А так как mental ray в отличии от Iray может использовать несколько источников света типа Skylight, то и IBL может генерировать освещение на основе нескольких карт окружения.
  • Объекты с углублениями, или сцены интерьера, которые напрямую не освещаются Native IBL нуждаются в более высоких настройках Final Gather и использовании источников света типа mr Sky Portal.
  • Старайтесь использовать только  HDR изображения. JPEG изображения и другие обычные форматы не обладают широким динамическим диапазоном для создания хорошего освещения
  • Не забывайте использовать в большинстве случаев Final Gather c низкими настройками чтобы уменьшить время визуализации, так как основную работу проделывает Native IBL.
P.S. Наверное комплиментом для любого тридешника является тот факт когда синтетическое (пусть и частично) изображение принимают за настоящее. Попав через кросспост Вконтакте в группу посвященную мопедкам, людям далеким от 3d, это изображение получило следующие коментарии:




3 комментария:

  1. Как запилить каустику с IBL, то есть чтобы каустика генерировалась от самых ярких источников света HDRI?

    ОтветитьУдалить
  2. Отлично все описано, спасибо :)

    ОтветитьУдалить