У цьому уроці Akin Bilgic розглядає процес створення displacement-карт в ZBrush і Mudbox, а також подальшу роботу з ними в V-Ray для Maya, V-Ray для 3ds Max, V-Ray для Cinema 4D і Arnold для Maya.
Карти displacement завжди були загадкові і погано піддавалися вивченню, викликаючи певне, хоч і абсолютно необґрунтоване незручність в роботі. У блогах 3D-художників частенько зустрічаються статті, в яких вони досить докладно показують процес створення лоупольной і хайпольной моделей, з останньою вони потім знімають карти, призначають їх на лоупольный меш і з допомогою бубна отримують околонужный результат. Проте при правильному підході лоупольный меш буде виглядати в точності, як хайпольный.
Для початку давайте постараємося зрозуміти, як працюють displacement-карти типу floating-point і як визначити коректність отриманого результату. Потім ми розглянемо види грабель, на які зазвичай настає переважна більшість художників, а так само способи цього уникнути. В кінці буде наведена покрокова інструкція, дотримуючись якої ви отримаєте доставляє результат з використанням displacement-карт.
ЯК ПРАЦЮЮТЬ DISPLACEMENT-КАРТИ ТИПУ FLOATING-POINT
Взагалі карти displacement – це дикі наукові нетрі. Простими словами – це метод, за допомогою якого інформація з високо деталізованої геометрії запікається на карту, яку потім можна застосувати для низько деталізованої геометрії. Коректно створена карта displacement типу floating-point повністю спроектує всю деталізацію з хайпольного меша на лоупольный. Всю деталізацію. Від початку і до кінця.
А відбувається це, тому що працює карта displacement типу floating-point дуже логічно: значення пікселів карти displacement точно відповідають значенням юнітів в 3D-редакторі. Таким чином, значення пікселя 1.0 відповідає 1 юніта в сцені. Піксель зі значенням 0,5 видавлює меш в сцені на 0,5 юніта. Піксель зі значенням 0.0 взагалі не буде що робити. Все дуже логічно. Завдяки тому, що значення пікселів displacement-картки зберігають у вигляді числових даних з плаваючою комою, вони зберігають значення пікселя вище значення 1.0, а негативні значення нижче 0.0. Це дуже потужний спосіб зберігання точної інформації.
Проілюструємо це на прикладі простої площині:
3 площині, по-різному розташовані вздовж осі Y, що складаються з одного полігону, для кожної площини зроблена планарна UV-розгортка.
Положення першої площини – +35 юнітів по осі Y.
Положення другої площини – 0 юнітів по осі Y.
Положення третьої площини – -20 юнітів по осі Y.
Три однакові площини розташовані по-різному вздовж осі Y
Імпортуємо сцену в ZBrush або Mudbox, дивайднем другу площину кілька разів і поскалптим. Витягнемо її центр так, щоб він торкався першої площини, потім видавив пару ділянок по краях, так, щоб вони стосувалися нижній площині. Проявити фантазію і напишемо що-небудь на площині, щоб додати ще деталей.
Процес скалптинга площині
Не зупинимося на досягнутому і створимо displacement-карту для нещасної площині, за допомогою описаної нижче процедури. Тепер ми можемо відкрити отриману карту практично в будь-якій програмі типу Nuke, яка легко працює з даними з плаваючою комою.
За допомогою вбудованого вьювера Nuke може потестить карту displacement. Якщо підвести курсор до центральної точки зображення, яка відповідає верхній точці витягнутої частини меша, Nuke покаже цифру 35.0, яка, якщо згадати, ідеально відповідає місцю розташування першої площини. Якщо опустити курсор до нижньої точки видавленою частини меша, можна побачити цифру -20.0, що відповідає місцю розташування третьої площини.
Вьювер Nuke, при наведенні курсору на відповідні точки, показує значення пікселів. Зображення пофарбовано в червоний, оскільки карті displacement для зберігання інформації потрібен тільки один канал. Таким чином, всі дані зберігаються в каналі червоного кольору. Від’ємні значення не видно, оскільки вони розташовані нижче значення 0.0, відображення таких значень знаходиться за межами можливостей наших моніторів.
Так, ми можемо припустити, що ця карта displacement створена коректно, оскільки ми точно знаємо, як саме ми розташували площині вздовж осі Y. І ми однозначно можемо призначити цю displacement-карту на другу площину в 3D-редакторі, слідуючи інструкціям, наведеним нижче. Натиснувши на Render, ми побачимо, що результат на рендері ідеально відповідає результату в програмі для скалптинга, середина другої площини ідеально витягнута на +35.0 юнітів, а ділянки по боках видавлено точно на -20.0 юнітів. Таким чином, меш зазнав зовсім коректні зміни.
Карта displacement, призначена на другу площину, яка потім була відрендерена, створює поверхню, ідеально відповідну тієї, яку ми отримали у програмі скалптинга
На іншому прикладі показана карта displacement, призначена на більш складний об’єкт зі швами на UV-розгортках, а отриманий результат все одно ідеальний. Куби по краях сфери складають 5 юнітів ширину і є візуальним підтвердженням коректності накладених displacement-карт.
Карта displacement, без проблем призначена на більш складний об’єкт
І, нарешті, приклад карти displacement, призначеної на органічний об’єкт. Деталізація, яку можна побачити на зображенні, є справою рук displacement-карти, ніяких сторонніх bump – або normal-карт. Результат ідеально збігається з хайпольной геометрією.
Зліва: бейз меш без карти displacement, праворуч: бейз меш з картою displacement
НАЙБІЛЬШ ПОШИРЕНІ ГРАБЛІ І СПОСОБИ ЇХ УНИКНУТИ
UV-РОЗГОРТКА МЕГА ВАЖЛИВА
Для displacement дуже важлива хороша UV-розгортка. Накладання UV можуть викликати помилки при генеруванні карт. Крім того, перевірте, щоб розгортка розташовувалася усередині UV-простору від 0 до 1.
ПЕРЕВІРЯЙТЕ БЕЙЗМЕШ ДВІЧІ (ТРИЧІ)
При скалптинге на високих рівнях дивайдов часто змінюється положення вертексов на нижніх рівнях дивайдов. Таким чином, лоупольный меш, який ви імпортували в програму для скалптинга буде відрізнятися від лоупольного меша, який ви використовуєте для створення карт displacement. Завжди перевіряйте, щоб лоупольный меш, який ви використовували для створення карт displacement, не відрізнявся від того, на який ви призначаєте displacement-карту.
КАРТИ DISPLACEMENT ТИПУ FLOATING-POINT ЗАЛЕЖАТЬ ВІД МАСШТАБУ
З-за того, що значення пікселів displacement-карти типу floating-point відповідають юнітам в сцені, масштаб об’єкта стає важливим фактором, ігнорування якого може привести до плачевних результатів. Якщо ви отскейлили лоупольный меш після створення карти displacement, вона перестане бути коректною. Карту доведеться або створити заново, або компенсувати з допомогою настройки «Displacement Amount» в V-Ray. Параметр «Висота» відповідає за це ж Arnold. Наприклад, якщо ви збільшили об’єкт в два рази, слід помножити значення карти displacement на два, щоб компенсувати її вплив.
FLOATING-POINT VS INTEGER
Процедура, описана нижче, передбачає створення 32-бітових карт displacement, однак також можна використовувати і 16-бітову карту displacement типу floating-point, що дозволить отримати практично ідентичний результат.
Переконайтеся, що ви зберігаєте карту displacement в 16-бітному форматі типу floating-point, а не в 16-бітному форматі integer. Щоб формат integer спрацював коректно, доведеться чимало потанцювати з бубном. І все тому що цей формат не підтримує дані з негативними значеннями, з якими легко працюють карти displacement. Якщо ви вже задумалися, як отримати ту або іншу карту, просто виконайте інструкції, наведені нижче, щоб створити 32-бітову карту displacement.
КАРТИ DISPLACEMENT ЗДАТНІ НА БАГАТО
В ідеальному світі карти displacement типу floating-point проектуються ідеально, при цьому лоупольный меш неможливо відрізнити від хайпольного. На жаль, 3D-редактори, як і наша реальність, недосконалі, при цьому кожен з редакторів по-різному вирішує різні завдання. За коректне проектування інформації з карти displacement на лоупольный меш в будь-якому 3D-редакторі відповідає алгоритм згладжування. Деякі редактори для згладжування мешей використовують алгоритм Catmull-Clark, інші ж дотримуються зовсім іншої методу. Звичайно, з часом розробники 3D-редакторів прийшли до компромісу і нарешті вирішили використовувати однаковий алгоритм (наслідуйте приклад Pixar у випадку з OpenSubdiv і напишіть листа розробникам софта, в якому ви працюєте, сподвигнув їх на таке), хоча, звичайно, іноді трапляються незначні відмінності між хайпольным і лоупольным мешами. Гарна новина полягає в тому, що ці відмінності справді незначні, але тільки якщо ваш лоупольный меш не такий вже і лоупольный. Не розцінюйте карти displacement як ту саму омріяну кнопку «Зробити красиво». І не чекайте, що кубик з допомогою карт displacement перетвориться в наливне яблучко. Ваше основне завдання – змоделювати коректний бейз меш з хорошою топологією і достатнім дозволом, про деталі ж подбають карти displacement.
ЗНЯТТЯ КАРТ DISPLACEMENT
Тепер ми знаємо, як працюють displacement-карти, і що від них чекати. Далі приходить черга впорядкованого натискання на потрібні кнопочки в різному щоб спочатку зняти карти displacement з хайпольного меша, а потім призначити їх на лоупольный в улюбленому 3D-редакторі. При цьому кожна з наведених налаштувань є результатом ретельного тестування.
ZBrush (Multimap Exporter):
Відкрийте або імпортуйте хайпольный меш з численними дивайдами.
Якщо ви імпортували хайпольный меш з іншого редактора, відновіть рівні підрозділів, зайшовши на вкладку Tool – Geometry і натиснувши на кнопку «Reconstruct Subdiv».
У вкладці ZPlugin відкрийте вкладку Multi Map Exporter, перевірте, щоб кнопка Displacement була підсвічена.
За допомогою повзунка встановіть необхідний розмір майбутнього зображення (від 2k і вище).
Увімкніть опцію «Flip V».
Натисніть на кнопку «Export Options», щоб відкрити додаткові опції карт.
Повзунок «SubDiv Level» встановіть бажаний рівень підрозділів.
Вимкніть опцію «Adaptive».
Встановіть значення «DPSubPix» 4.
Вимкніть опцію «SmoothUV».
Встановіть значення «Mid» 0.
Вимкніть опцію «3 Channels».
Встановіть значення бітності майбутнього зображення «32 Bit», а розширення EXR.
Встановіть «Scale» 1.
Перевірте правильність встановлених вами налаштувань
Натисніть на кнопку «Create All Maps», придумайте назву файлу і виберіть папку для його збереження. Не переживайте, якщо ZBrush пише, що тип файлу TIF, насправді карта збережеться в форматі EXR, оскільки ми включили відповідну опцію.
Натисніть на кнопку «Save», щоб запустити процес генерації карти displacement.
І displacement-карта готова!
Необхідно відзначити дещо, щодо ZBrush і плагіна Multimap Exporter:
У більш ранніх версіях ZBrush (а ми пам’ятаємо, що остання існуюча версія – ZBrush 4R6) плагін Multimap Exporter зберігав карту displacement тільки в 32-бітному форматі TIFF, який ні Maya, ні 3ds Max не розуміли. Таким чином, якщо ви працюєте в більш ранніх версіях ZBrush, вам доведеться пересохранить 32-бітову карту displacement в Nuke або Photoshop в розширенні EXR, щоб можна було працювати з нею в Maya і 3ds Max. При конвертуванні карти в Photoshop перевірте, що ви працює в режимі RGB, а не в Grayscale (меню Image – Mode).
ZBrush (Displacement Subpallette):
Відкрийте або імпортуйте хайпольный меш з численними дивайдами.
Якщо ви імпортували хайпольный меш з іншого редактора, відновіть рівні підрозділів, зайшовши на вкладку Tool – Geometry і натиснувши на кнопку «Reconstruct Subdiv».
У вкладці Tool — Geometry встановіть значення SDiv на бажаний рівень підрозділів.
У вкладці Tool — UV Map встановіть необхідний розмір UV-розгортки (від 2k і вище).
У вкладці Tool — Displacement натисніть на порожній квадратик в правому верхньому кутку і виберіть альфу з випадаючого меню.
Після того, як зображення завантажене, встановіть значення Mid 0.
Знову натисніть на квадратик з завантаженої альфою і виберіть опцію «Alpha Off» у верхньому лівому кутку.
Вимкніть опцію «Adaptive».
Встановіть значення «DPSubPix» 4.
Вимкніть опцію «SmoothUV».
Увімкніть опцію «Flip V».
Встановіть «Scale» 1.
Вимкніть опцію «3 Channels».
Увімкніть опцію «32 Bit».
Перевірте правильність встановлених вами налаштувань
Натисніть на кнопку «Create And Export Map», придумайте назву файлу і виберіть папку для збереження, тип файлу виберіть «OpenEXR 32bit».
Натисніть на кнопку «Save», щоб запустити процес генерації карти displacement.
І displacement-карта готова!
Mudbox:
Відкрийте або імпортуйте хайпольный меш з численними дивайдами.
Якщо ви імпортували хайпольный меш з іншого редактора, відновіть рівні підрозділів, виконавши команду «Mesh — Rebuild Subdivision Levels».
Перейдіть до «UVs & Maps — Extract Texture Maps — New Operation» в панелі Menu.
Поставте галочку «Displacement Map», вибравши зі списку «Maps To Generate».
В Target Models виберіть меш на нижньому рівні дивайдов, зазвичай це нульовий рівень.
Увімкніть опцію «Target Models».
Відключіть опцію «Smooth Target UVs».
Увімкніть опцію «Use Creases & Hard Edges».
В Source Models виберіть меш на найвищому рівні дивайдов.
Увімкніть опцію «Smooth Source Models».
Встановіть Method як «Ray Casting».
Встановіть значення Choose Samples «Closest To LowRes Mesh».
Увімкніть опцію «Test Both Sides.
Натисніть на кнопку «Best Guess», щоб обчислити значення Search Distance.
Виберіть «Generate one map for all targets» з випадаючого списку.
Розмір зображення: Виберіть бажаний розмір зображення (від 2k і вище).
Відключіть опцію «Antialiasing».
Відключіть опцію «Normalize Distance To Search».
Встановіть «Map Type» «Texture».
Натисніть на параметрах «Base Filename» (…), придумайте назву файлу і виберіть папку для збереження, тип файлу виберіть «OpenEXR 32bit Floating-Point».
Відключіть опцію «Preview As Bump Map».
Перевірте правильність встановлених вами налаштувань
Натисніть на кнопку «Extract», щоб запустити процес генерації displacement-карт.
І displacement-карта готова!
ПРИЗНАЧЕННЯ DISPLACEMENT-КАРТ
V-Ray для Maya:
Імпортуйте лоупольный меш (двічі перевірте, що ви працюєте з тим же мешем, з якого ви запікали карти).
Виберіть меш, відкрийте Attribute Editor і виберіть там шейп ноду об’єкта. Потім в меню Attribute Editor натисніть «Attributes — V-Ray» і включіть опцію «Subdivision», «Subdivision and Displacement Quality», а також «Displacement Control», щоб у шейп ноде меша з’явилися додаткові атрибути.
Прокрутіть налаштування Attribute Editor вниз і розкрийте вкладку «Extra V-Ray Attributes».
Увімкніть опцію «Render As A Subdivision Surface»
Відключіть опцію «Subdivide UVs».
Для початку встановіть значення «Edge Length» 4.0 і поступово знижуйте його, щоб поліпшити якість displacement, що, безсумнівно, збільшить час рендера.
Встановіть тип «Normal Displacement» в випадаючому меню «Displacement Type».
Увімкніть опцію «Keep Continuity».
Решта залиште налаштування за замовчуванням.
Перевірте правильність встановлених вами налаштувань
Відкрийте редактор Hypershade, створіть матеріал VRayMtl і призначте його на меш.
У вкладці Shading Groups в Hypershade виберіть тільки що створений VRayMtlSG, натисніть RMB, щоб вибрати «Graph Network», щоб бачити об’єкт і ноду VRayMtl в робочому просторі Hypergraph.
Додайте ноду «Displacement» в робочий простір нод ліворуч, а потім перетягніть її за допомогою MMB на ноду VRayMtlSG, вибравши «Default».
Додайте в робочий простір нод зліва ноду «File», а потім перетягніть її за допомогою MMB на ноду Displacement, вибравши «Other».
У лівій частині connection editor натисніть на плюс поруч із «OutColor», щоб розгорнути її, потім виберіть «OutColorR», приєднавши її до «Displacement» праворуч.
У вікні Hypergraph виберіть ноду «File» і завантажте раніше створену мапу displacement в «Image Name».
У меню Attribute Editor натисніть «Attributes — V-Ray» і включіть опцію «Texture Input Gamma» і «Allow Negative Colors» , щоб додати додаткові атрибути в ноду File.
Прокрутіть вниз Attribute Editor і відкрийте опції V-Ray Extra Attributes», щоб змінити тип простору на «Linear», і включіть опцію «Allow Negative Colors».
Змініть тип рендерера у вікні налаштувань рендера на «V-Ray» і перейдіть у вкладку «Global Options» в його налаштуваннях. Перевірте, щоб опція «Displacement» була включена.
От і все. Можна отрендерить сцену, щоб подивитися на результат.
V-Ray для 3ds Max:
Імпортуйте лоупольный меш (двічі перевірте, що ви працюєте з тим же мешем, з якого ви запікали карти).
Виберіть меш, у вкладці Modify призначте об’єкту модифікатор «Unwrap UVW».
Натисніть на кнопку «Open UV Editor…», розташовану іже випадаючого списку.
У вікні Edit UVs увімкніть режим виділення вертексов і виберіть всі UV (Ctrl+A). Потім виконайте команду «Tools -> Break», щоб розірвати UV-эджи . Закрийте вікно Edit UVs.
Призначте на об’єкт модифікатор «Turbosmooth» поверх модифікатор «Unwrap UVW».
Встановіть Iterations 0 (або будь-яке інше число, в залежності від того, що ви хочете спостерігати під вьюпорте).
Увімкніть опцію «Render Iters» і встановіть для нього значення 3.
Призначте на об’єкт модифікатор «V-RayDisplacementMod».
Увімкніть опцію «3D Mapping».
Натисніть на кнопку «None», виберіть «Bitmap» з випадаючого списку Material/Map.
Виберіть карту displacement. Увімкніть опцію «Override», розташовану нижче групи Gamma, перевірте, щоб значення опції було 1.0 і натисніть «Open».
У діалоговому вікні налаштування OpenEXR вимкніть опцію Enable Color Correction зліва і натисніть «OK».
Для початку встановіть значення «Edge Length» 4.0 і поступово знижуйте, щоб поліпшити якість displacement, що, безсумнівно, збільшить час рендера.
Відключіть опцію «Smooth UVs» і «Smooth UVs At Borders».
Увімкніть опцію “Check ‘Keep Continuity”.
Значення «Texmap Min» і «Texmap Max» повинні перевищувати негативні і позитивні значення, представлені у карті displacement. Це значення можна автоматично знайти в Nuke з допомогою ноди «CurvesTool» в режимі «Max Luma Pixel». Якщо у вас немає Nuke, поекспериментуйте з цими значеннями, начинав з -1.0 і 1.0. Потім збільшуйте ці значення, якщо помітите щось ненормальне при проектуванні displacement.
Решта залиште налаштування за замовчуванням.
Перевірте правильність встановлених вами налаштувань
Змініть тип рендерера у вікні налаштувань рендера на «V-Ray» і перейдіть у вкладку «Global Switches» в його налаштуваннях. Перевірте, щоб опція «Displacement» була включена.
От і все. Можна отрендерить сцену, щоб подивитися на результат.
V-Ray для Cinema 4D:
Імпортуйте лоупольный меш (двічі перевірте, що ви працюєте з тим же мешем, з якого ви запікали карти).
Створіть «vrayAdvancedMaterial» вибравши в меню «Create — Shader – VrayBridge» в редакторі матеріалів. Перетягніть його на меш в Object manager.
Потім створіть «vrayDisplaceMaterial» з того ж самого меню. Перетягніть його на меш в Object manager, так, щоб обидва матеріали були розташовані поряд, а displacement знаходився праворуч від advanced матеріалу.
Відкрийте vrayDisplaceMaterial. У слоті текстури натисніть на стрілочку і додайте VrayBridge -> vrayShader.
Натисніть на шейдер і виберіть у випадаючому меню «vrayBitmap». Встановіть лінійне робочий простір і завантажте карту displacement. Увімкніть опцію «Allow Negative Colors».
У загальних налаштуваннях vrayDisplaceMaterial увімкніть опцію «Tight Bounds» і «Use As Subdivision Surface».
При цьому Displacement type повинен бути «3D Mapping», а опція «Keep Continuity» включена.
Значення «Amount» необхідно встановити 3.0 замість 1.0. Це абсолютно читерский прийомчик, який потрібен виключно для Cinema 4D, яка буде шукати displacement-дані в зеленому і синьому каналах нашого EXR. І, оскільки вся інформація зберігається в червоному каналі, вона нічого не знайде в зеленому і синьому каналах, вирівнявши їх дані з інформацією в червоному каналі, з-за чого сила displacement буде становити 1/3 від необхідної. Таким чином, «Amount» 3.0 замість 1.0 компенсує глюк Cinema 4D, створюючи displacement, порівнянний з деталізацією хайпольного меша.
Для початку встановіть Render Settings — VrayBridge — Displacement значення 4.0 і поступово знижуйте його, щоб поліпшити якість displacement, що, безсумнівно, збільшить час рендера.
Перевірте, щоб Displacement був включений у налаштуваннях фонового в V-Ray.
От і все. Можна отрендерить сцену, щоб подивитися на результат.
Arnold для Maya:
Імпортуйте лоупольный меш (двічі перевірте, що ви працюєте з тим же мешем, з якого ви запікали карти).
Виберіть меш, відкрийте Attribute Editor і вкладки «Arnold», «Subdivision», «Displacement Attributes».
Встановіть «Type» «catclark».
Для початку встановіть для «Iterations» в Subdivision rollout значення 5 і поступово збільшуйте його, щоб поліпшити якість displacement, що, безсумнівно, збільшить час рендера.
У вкладці Subdivision встановіть «UV Smoothing» «Linear».
Значення параметра «Bounds Padding», розташованого у вкладці Displacement Attributes, має перевищувати негативні і позитивні значення, представлені у карті displacement. Це значення можна автоматично знайти в Nuke з допомогою ноди «CurvesTool» в режимі «Max Luma Pixel». Якщо у вас немає Nuke, поекспериментуйте з цими значеннями, почавши з 1.0. Потім збільшуйте це значення, якщо помітите щось ненормальне при проектуванні displacement.
Решта залиште налаштування за замовчуванням.
Відкрийте Hypershade і призначте об’єкту aiStandard матеріал.
Кликніть в Hypershade на групі шейдерів і виберіть тільки що створений матеріал aiStandardSG, RMB на ньому, щоб вибрати «Graph Network», щоб ноди шейдера з’явилися в робочому просторі Hypergraph
Додайте ноду «Displacement» в робочий простір нод Hypershade ліворуч, потім перетягніть її за допомогою MMB на ноду aiStandardSG, вибравши «Default».
Додайте в робочий простір ноду «File» зі списку нод Hypershade ліворуч, потім перетягніть її за допомогою MMB на ноду Displacement і виберіть «Other…».
У лівій частині Connection Editor натисніть на плюс поруч із «OutColor», щоб розгорнути, послідовно виберіть OutColorR, потім значення «Displacement» в правій частині, щоб з’єднати їх.
Виберіть Hypergraph ноду «File», виберіть в Attribute Editor і завантажте раніше створену мапу displacement.
Відкрийте вікно налаштувань фонового в Maya і перейдіть у вкладку «Override» в його налаштуваннях. Перевірте, щоб опція “Ignore Displacement'” була відключена.
От і все. Можна отрендерить сцену, щоб подивитися на результат.
Журналіст: Альона