Погружение в ментал (Proxy - мифы и реальность)
Всех приветствую!
В первой части урока я расскажу, как использовать объект mr Proxy. Собственно в этом нет ничего сложного, но меня удивляет неоднозначное отношение к нему. В форумах некоторые сетуют, что прокси не дают экономии во времени рендеринга, а ожидают того, что чуть ли на 386 процессорах можно обсчитывать огромные сцены. А некоторые высказываются, что в проксях толку нет – только вред. В этом уроке мы на реальных цифрах посмотрим на целесообразность данного объекта. Во второй части мы рассмотрим один из частных случаев оптимизации сцены под быстрый обсчет. В уроке я не буду выкладывать файлы сцен, так как в первой части все элементарно, а во второй части я хочу, чтобы исполняющие сами сделали шейдерный материал, тем самым поняв гибкость шейдерной структуры. Урок исполняется в 3ds Max 2009. Рассчитан на пользователей кто знаком с интерфейсом Макса, ну и конечно желателен опыт работы в нем, чтобы понять целесообразность различных действий.
Часть первая – Proxy
Создание proxy-объекта:
Create – Geometry – mental ray – mr. Proxy
На сцену кладется пустой контейнер. Заходим в свойства созданного mr Proxy, верхняя графа – Source Object – жмем на кнопку с надписью None и мышкой щелкаем по объекту, который хотим сделать прокси-объектом.
Добавлять можно только один объект! Группы объектов и сборки также невозможно добавить в одну проксю. В сети существует скрипт, позволяющий автоматически объединить несколько объектов и сохранить их как прокси-объект, но при совмещение сложных объектов происходить сбой (у меня по крайней мере), поэтому следует помнить пословицу о бесплатном сыре, да и объединить несколько объектов в одну сетку (мэшь) руками не так уж и сложно.
После добавления мы получаем в габаритном контейнере копию оригинала. Раздел в настройках - «Display» позволяет настроить отображение объекта во вьюпортах; «Viewport Verts» - задает количество вершин объекта, которые будут видны. На этапе позиционирования контейнера объекта на сцене, количество можно увеличить, чтобы иметь представление о реальной геометрии объекта, потом выставить минимальное значение (позаботиться о производительности). Ниже «Viewport Vertы» идут два переключателя «Show Point Cloud» - отображать точки (вершины) объекта и «Show Bounding Box» - отображать рамку вокруг габаритного контейнера (без рамки трудно выделить объект мышкой).
Кнопка «Write Object to File» сохраняет прокси-объект в файле (сохранятся в виде файла *.mib и дополнительно графического файла превьюшки) во время сохранения будет задан вопрос об способе сохранения - отдельный кадр, фрагмент или вся анимация (да, да прокси позволяет сохранять воздействие на объект модификаторов с течением времени). После сохранения произведется рендеринг «внутренностей » прокси и у нас появиться файлик с объектом.
При добавлении в сцену Proxy-объектов, сначала нужно создать пустой mr Proxy, затем в настройках нажать кнопку на поле «Proxy File» и указать путь к файлу объекта.
Важно: При указании имени и расположения файла прокси-объекта, Макс запоминает только линк объекта, открытие файла не происходит! Если проводиться работа группой из нескольких человек над одной сценой, то расположенные на сцене прокси-объекты могут меняться и усовершенствоваться. Открытие файла прокси происходит только при рендере сцены, соответственно и изменения исходного файла учитываются на этот момент. Если файл по указанному пути отсутствует, то рендер выдаст сообщение об этом.
В свитке настроек есть окошко с предпросмотром , туда выводиться изображение которое создается при сохранении прокси файла. Если мы назвали файл «test», то в результате (если не отключить эту опцию) сформируется 2 файла : test.mib и test.mib.bmp, изображение из последнего будет выводиться в окно предпросмотра. Если над сценой работают несколько человек, то удобно к создаваемым проксям в графическом файле делать свои подписи с помощью любого редактора:
Под окном просмотра раздел порта анимации: «Animation Support». Если при сохранении прокси-файл сохранялся в несколько кадров, то их можно все (или часть) включить а анимацию нашей сцены. Включив параметр «Ping-Pong Replay» можно зациклить анимацию прокси-объекта, на продолжительность всей сцены.
С созданием и добавлением прокси вроде разобрались, теперь про материалы:
В прокси-объект материал не сохраняется! Поэтому при создании возьмите пипеткой материал с создаваемого объекта (если он заранее не подготовлен) и сохраните его в библиотеку, для последующего использования. После добавления proxy-объекта на него можно просто добавить сохраненный материал (структура мэша на уровне элементов сохраняется, поэтому использование multi-sub материала возможна).
В Хелпе на mr Proxy упоминается использование материала «Xref». На мой взгляд использование этого материала актуально только в работе группой, тем не менее давайте его разберем.
Материал X-Ref это материал-ссылка на материал другой сцены.
В настройках путь к файлу сцены (донора) и имя объекта (донора) на указанной сцене:
Важно: Материал берется с указанного объекта, по его имени, а не из редактора материалов. Данные по материалу считываются один раз и сохраняются, дальнейшее изменение материала на объекте доноре не приведет к изменению материала XRef. Для обновления данных по материалу необходимо будет перевыбрать объект донор.
Давайте закончим с теоретической частью и посмотрим эффект от применения прокси на практике.
Для примера я на плоскость состоящую из 2 полигонов добавил 10 одинаковых деревьев (пока без листьев) с усложненной, TurboSmooth’ем сеткой. Итого получилась сцена с четырьмя с половиной миллионами полигонов: (тестирование на машине с E4400 – 2х2Ghz и 2Гб ОЗУ)
Рендерим (GI с минимальными настройками качества)
Рендер 5 минут 30 секунд.
Макс с открытой сценой занимает 322 мегабайт ОЗУ, во время рендеринга используется 1348 мегабайт ОЗУ (в объем ОЗУ включена и ОС и все что у меня висело в трее, то есть это общий расход ОЗУ)
Теперь заменяем все деревья на прокси (для чистоты тестирования удобно полностью копировать параметры положения, наклона и масштаба объекта донора на те же параметры прокси)
Рендер 4 минуты 42 секунды. (Я не стал приводить картинку рендера, она один к одному – отличий нет совсем)
Макс с открытой сценой занимает 282 мегабайта ОЗУ, во время рендера используется 1170 мегабайт ОЗУ.
Время рендера отличается не сильно (на некоторых сценах, это вообще не заметно), а вот экономия ОЗУ очень сильная!
В общем-то последствия ожидаемые, так как рендерить объект из прокси все равно приходиться, учитывать в распространении фотонов тоже, пусть он и представлен в удобном для рендера формате. Отсюда и небольшая разница по времени. А вот из-за того что сам объект не сидит в ОЗУ, а грузиться с диска мы получаем существенную экономию используемой памяти.
Это особенно актуально на машинах с 32-битной системой. Простой пример:
Я увеличил количество деревьев до 20 штук. Рендер на проксях проходит за 16 минут, рендер с настоящими объектами за 52 минуты. Почему такая разница во времени? Все из за того что с проксями используется 1698 мегабайт ОЗУ (в пределах физической памяти), а с настоящими объектами 2586 мегабайт - ОЗУ физическая кончилась и пошла виртуальная на HDD, где скорость передачи данных намного меньше. При количестве деревьев 32 шт рендер на проксях проходит, хоть и тратиться больше 1 часа, а вот с настоящими объектами рендер не возможен – не хватает памяти.
ИТОГ: Proxy экономит оперативную память компьютера, за счет удаления информации об объекте со сцены на диск, что позволяет нам делать более масштабные сцены, и немного экономит время рендера, за счет оптимизированного представления информации о файле.
Часть вторая – экономим время
А как же «все и сразу и чтобы ничего за это не было!» как сэкономить и ОЗУ и время рендера? Вот об этом мы и поговорим во второй части. Для этого перенесемся на совсем слабую машину (с точки зрения 3d графики слабую) это будет :
Можно сказать просто продвинутый офисный компьютер.
Я изобразил не бог весть какой сложности зданьице с минимальном количеством полигонов:
И хочу его обсчитать с большим количеством фотонов и хорошими настройками FG, а еще я хочу обсадить его деревьями!
В результате одиночное здание обсчитывается за 6 минут, а в виде:
За 46 минут 03 секунды. Где справедливость ? мы добавили несколько второстепенных объектов а получили рендер в 7 раз дольше!!! Если заменить деревья на прокси-объекты, получим рендер за 44 минуты и 12 секунд, опять несправедливо – слишком маленькая экономия !
Давайте подумаем что нам надо от второстепенных объектов (наших деревьев) – нам нужно чтобы они были объемными (то есть растровым изображением их не заменить), они должны отбрасывать тени, они должны освещаться, а вот эффекты игры света от непрямой иллюминации могут быть не очень точными – лишь бы было подобие.
Спасет нас материал Ambient Occlusion!
Мы можем исключить деревья из непрямой иллюминации, оставив только получение FG (а если не использовать фотометрическую экспозицию и светящиеся материалы можно убрать и получение FG), а все эффекты освещения получим на материале сами.
Итак Ambient Occlusion
Теорию данного материала описывать не буду, кому интересно вот статься Игоря Сивакова:
http://www.ixbt.com/soft/mr33-2-ao.shtml
Также описание настроек и действие упомянуто в моем уроке:
Погружение в ментал (шейдерный материал mental ray)
В двух словах Ambient Occlusion имитирует Глобальное освещение на материале путем учета окружающей геометрии, без учета источников света.
Остановлюсь только на 4 нужных нам сейчас параметрах шейдера Ambient/Reflective Occlusion (3dsmax)
Samples - это качество обсчета эффекта чем больше, тем лучше
Bright & Dark - светлая (освещенная) и темная(полностью затененная) часть материала
Spread – качество размытия границ:
Max distance – параметр с которого берется расстояние радиуса полусферы (видимая часть) с которой идет трассировка каждой точки для выяснения – пересекает ли луч объекты сцены и соответственно формирует цвет точки. Если параметр равен нулю то трассировка идет с фона (бесконечный радиус). Несмотря на сложность понятия термина , это очень нужный параметр. Допустим объект находится в закрытом помещении и дистанция равна 0 – объект будет всегда черным (так как стены помещения блокируют лучи трассировки) а если параметр дистанции выставить на расстояние меньшим чем расстояние до стены помещения, то мы получим нормальный эффект – освещение внутри помещения.
Теперь создадим материал на основе этого шейдера для самого сложного объекта – листьев моих деревьев.
1. Корневой материал «mental ray»
2. Слот Surface (а позже скопируем результат и в Shadow) карта «Mix»
3. То что отсекает маска – будет прозрачным (ставим шейдер Transmat), то что осталось – шейдер Ambient…..
4. В слот Bright я поставил DGS материал с растром листа дерева, а в слоте Dark можно оставить черный цвет, либо тот же материал, но с темной растровой картой.
Весь процесс я изобразил на схемке:
Для поверхностей, где не нужна карта прозрачности(ствол дерева), можно сразу в раздел Surface материала mental ray ставить шейдер Ambient/Reflective Occlusion (3dsmax)
Если мы имитируем эффект глобального освещения, то объекты к которым будет применяться такой материал (деревья) должны быть исключены из расчетов настоящего глобального освещения:
Выделяем все то что у нас не будет участвовать в расчетах(у меня это деревья), правый клик мышки и заходим в свойства объекта, закладка mental ray:
Устанавливаем переключатель для FG в положение Invisible to FG, для Глобальной иллюминации ставим галку на Exclude from GI. Есть еще один параметр – Receive Illumination from FG, это получение результата освещения объектом от расчета FG, на быстродействие он влияет не сильно, а вот при больших значениях экспозиции может сильно попортить яркость картинки, поэтому этот параметр я оставил.
Теперь тестовые рендеры (слева освещаем GI с обычными материалами, справа деревья исключены из GI и материал с АО)
Почему-то результат справа мне нравиться больше.
Теперь цифры:
- Без прокси без АО и с GI - время 46:03 – память 898 мегабайт
- С прокси без АО и с GI - время 44:12 – память 877 мегабайт
- С прокси и АО на деревьях - время 21:53 – память 858 мегабайт
Результат виден невооруженным взглядом!
Думаю после просмотра результатов урока Вы задумаетесь перед тем как нажать кнопку RENDER – а стоит ли облегчить расчеты компьютеру и получить экономию во времени? А время как известно это деньги!
С Уважением, КАА!