Тонкости Displacement

Опубликовано by AJIEHA . Размещено в Уроки

В этом уроке Akin Bilgic рассматривает процесс создания displacement-карт в ZBrush и Mudbox, а также последующую работу с ними в V-Ray для Maya, V-Ray для 3ds Max, V-Ray для Cinema 4D и Arnold для Maya.

displacement_figure_01

Карты 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.

displacement_figure_02

Три одинаковые плоскости расположены по-разному вдоль оси Y

Импортируем сцену в ZBrush или Mudbox, дивайднем вторую плоскость несколько раз и поскалптим. Вытянем ее центр так, чтобы он касался первой плоскости, затем выдавим пару участков по краям, так, чтобы они касались нижней плоскости. Проявим фантазию и напишем что-нибудь на плоскости, чтобы добавить еще деталей.

displacement_figure_03

Процесс скалптинга плоскости

Не остановимся на достигнутом и создадим displacement-карту для несчастной плоскости, с помощью описанной ниже процедуры. Теперь мы можем открыть полученную карту практически в любой программе типа Nuke, которая легко работает с данными с плавающей запятой.

С помощью встроенного вьювера Nuke может потестить карту displacement. Если подвести курсор к центральной точке изображения, которая соответствует верхней точке вытянутой части меша, Nuke покажет цифру 35.0, которая, если вспомнить, идеально соответствует местоположению первой плоскости. Если опустить курсор до нижней точки выдавленной части меша, можно увидеть цифру -20.0, что соответствует местоположению третьей плоскости.

displacement_figure_04

Вьювер Nuke, при наведении курсора на соответствующие точки, показывает значения пикселей. Изображение окрашено в красный, поскольку карте displacement для хранения информации нужен только один канал. Таким образом, все данные хранятся в канале красного цвета. Отрицательные значения не видны, поскольку они расположены ниже значения 0.0, отображение таких значений находится за пределами возможностей наших мониторов.

Так, мы можем предположить, что эта карта displacement создана корректно, поскольку мы точно знаем, как именно мы расположили плоскости вдоль оси Y. И мы, однозначно, можем назначить эту displacement-карту на вторую плоскость в 3D-редакторе, следуя инструкциям, описанным ниже. Нажав на Render, мы увидим, что результат на рендере идеально соответствует результату в программе для скалптинга, середина второй плоскости идеально вытянута на +35.0 юнитов, а участки по бокам выдавлены точно на -20.0 юнитов. Таким образом, меш претерпел совершенно корректные изменения.

displacement_figure_05

Карта displacement, назначенная на вторую плоскость, которая затем была отрендерена, создает поверхность, идеально соответствующую той, которую мы получили в программе скалптинга

На другом примере показана карта displacement, назначенная на более сложный объект со швами на UV-развертках, а полученный результат все равно идеален. Кубы по краям сферы составляют 5 юнитов ширину и являются визуальным подтверждением корректности наложенных displacement-карт.

displacement_figure_06

Карта displacement, без проблем назначенная на более сложный объект

И, наконец, пример карты displacement, назначенной на органический объект. Детализация, которую можно увидеть на изображении, является делом рук displacement-карты, никаких посторонних bump- или normal-карт. Результат идеально совпадает с хайпольной геометрией.

displacement_figure_07

Слева: бейз меш без карты displacement, справа: бейз меш с картой displacement

НАИБОЛЕЕ РАСПРОСТРАНЕННЫЕ ГРАБЛИ И СПОСОБЫ ИХ ИЗБЕЖАТЬ

UV-РАЗВЕРТКА МЕГА ВАЖНА

Для displacement очень важна хорошая UV-развертка. Перекрывающиеся UV могут вызвать ошибки при генерировании карт. Кроме того, проверьте, чтобы развертка располагалась внутри UV-пространства от 0 до 1.

ПРОВЕРЯЙТЕ БЕЙЗМЕШ ДВАЖДЫ (А ТО И ТРИЖДЫ)

При скалптинге на высоких уровнях дивайдов часто изменяется положение вертексов на нижних уровнях дивайдов. Таким образом, лоупольный меш, который вы импортировали в программу для скалптинга будет отличаться от лоупольного меша, который вы используете для создания карт displacement. Всегда проверяйте, чтобы лоупольный  меш, который вы использовали для создания карт displacement, не отличался от того, на который вы назначаете displacement-карту.

КАРТЫ DISPLACEMENT ТИПА FLOATING-POINT ЗАВИСЯТ ОТ МАСШТАБА

Из-за того, что значения пикселей displacement-карты типа floating-point соответствуют юнитам в сцене, масштаб объекта становится важным фактором, игнорирование которого может привести к плачевным результатам. Если вы отскейлили лоупольный меш после создания карты displacement, она перестанет быть корректной. Карту придется или создать заново, или компенсировать с помощью настройки «Displacement Amount» в V-Ray. Параметр «Height» отвечает за это же в 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.

displacement_figure_08

Проверьте правильность установленных вами настроек

Нажмите на кнопку «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».

displacement_figure_09

Проверьте правильность установленных вами настроек

Нажмите на кнопку «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 To Search Distance».

Установите «Map Type» «Texture».

Нажмите на параметрах «Base Filename» (…), придумайте название файла и выберите папку для его сохранения, тип файла выберите «OpenEXR 32bit Floating-Point».

Отключите опцию «Preview As Bump Map».

displacement_figure_10

Проверьте правильность установленных вами настроек

Нажмите на кнопку «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».

Остальные настройки оставьте по умолчанию.

displacement_figure_11

Проверьте правильность установленных вами настроек

Откройте редактор Hypershade, cоздайте материал 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.

Остальные настройки оставьте по умолчанию.

displacement_figure_12 displacement_figure_13

Проверьте правильность установленных вами настроек

Измените тип рендерера в окне настроек рендера на «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.

Остальные настройки оставьте по умолчанию.

displacement_figure_14

Откройте 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’» была отключена.

Вот и все. Можно отрендерить сцену, чтобы посмотреть на результат.

Журналист: Алена

Вас могут также заинтересовать:

Тэги: , , , , , , , , , , ,


Присоединяйтесь к нашему сообществу вКонтакте и читайте свежие новости и статьи о мире 3D