Занурення в ментал (Proxy – міфи та реальність)
У першій частині уроку я розповім, як використовувати об'єкт mr Proxy. Власне, в цьому немає нічого складного, але мене дивує неоднозначне ставлення до нього. У форумах деякі нарікають, що проксі не дають економії в часі рендерингу, а очікують на те, що на 386 процесорах можна обраховувати величезні сцени. А деякі висловлюються, що в проксях немає толку – тільки шкода. У цьому уроці ми на реальних цифрах подивимося на доцільність цього об'єкта. У другій частині ми розглянемо один із окремих випадків оптимізації сцени під швидкий обрахунок. В уроці я не викладатиму файли сцен, тому що в першій частині все елементарно, а в другій частині я хочу, щоб виконуючі самі зробили шейдерний матеріал, тим самим зрозумівши гнучкість шейдерної структури. Урок виконується в 3ds Max 2009. Розрахований на користувачів, хто знайомий з інтерфейсом Макса, і бажаний досвід роботи в ньому, щоб зрозуміти доцільність різних дій.
Частина перша – 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» і вказати шлях до файлу об'єкта.
Важливо : При вказуванні імені та розташування файлу проксі-об'єкта, Макс запам'ятовує лише лінк об'єкта, відкриття файлу не відбувається! Якщо проводиться робота групою з кількох людей над однією сценою, то розташовані на сцені проксі-об'єкти можуть змінюватись та вдосконалюватися. Відкриття файлу проксі відбувається тільки при рендер сцени, відповідно і зміни вихідного файлу враховуютьсяна цей момент. Якщо файл по зазначеному шляху відсутня, то рендер видасть повідомлення про це.
Зі створенням та додаванням проксі начебто розібралися, тепер про матеріали:
У проксі-об'єкт матеріал незберігається! Тому при створенні візьміть піпеткою матеріал з об'єкта, що створюється (якщо він заздалегідь не підготовлений) і збережіть його в бібліотеку, для подальшого використання. Після додавання proxy-об'єкта до нього можна просто додати збережений матеріал (структура мешу на рівні елементів зберігається, тому використання multi-sub матеріалу можливе).
У Хелпі на mr Proxy згадується використання матеріалу 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
Теорію даного матеріалу описувати не буду, кому цікаво статися Ігоря Сівакова:
Також опис налаштувань та дію згадано у моєму уроці:
Двома словами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 мегабайт
Результат видно неозброєним поглядом!