Maya Digital Gravure Shader

А где ж пельмени в натюрморте?
(Эпиграф)


А не слабо заняться гравюрой? Медная плита, травление, канифоль, сургуч, вар: Долгое, трудоемкое производство, не говоря об умении. Но завораживают названия: мессерштихель: шпицштихель: особенно - шрабкугель: и просто тянет сделать что-нибудь стильное, и чтоб отличалось изяществом и совершенством. Нет-нет, я не имею ввиду портреты президентов и Бенджамина Франклина. Хотя: впрочем: Нет! Оно вам надо?
Что? Пробовали только фломастерами? Не беда: Немного упорства, легкая меланхолия, трехкнопочная мышь, подключенная к приличному ящику с Maya Unlimited, и - вот оно - воплощение творческого открытия.

Увеличить

Ну, не Дюрер, конечно.
Гравюра, одна из важнейших графических техник, появилась в 15 веке, там же и расцвела, например, в произведениях того же Альбрехта Дюрера. Сейчас хороший мастер - большая редкость, и никакие компьютерные технологии, увы, его не заменят. Но, все-таки, стоит попробовать и ткнуться пятаком в калашный ряд.
Итак, построим упрощенный шейдер с жесткой привязкой линий гравировки к 3D объекту. И пусть это приводит к слишком "математическому рисунку линий, очень далекому от руки мастеров гравюры". Ничего, нужно начинать с простого. Вот и вырисовываются допущения:
1. Толщина линий гравировки зависит от степени освещенности объекта и "квантуется", допустим, на 8 шагов толщины.
2. Линии ложатся вдоль UV линий объекта.
3. Рисунок состоит только из взаимно пересекающихся линий.
4. Любой объект имеет краевой контур (Ink Line) заданного цвета.
Сразу заготавливаются образцы линий различной толщины. Я, например, использовал маленькие отрезки черных линий в jpg-файлах. А можно для создания отрезков применить 2D Texture Checker, или любой другой метод покруче на Ваше усмотрение. Таким образом, получился набор из 8 горизонтальных отрезков.



Забегу вперед и предъявлю картинку для общей ориентации "север-юг".

Увеличить

Выделяются две однообразные структуры, сводящиеся в узлы вертикальных и горизонтальных линий, замешивающиеся на один общий шейдер под гордым именем Engraver, состоящий из взаимопересекающихся линий разной толщины и выделяющегося краевого контура.

Увеличить

Предположим, что толщина линий гравировки на каждом объекте зависит только от условий его освещенности, то есть в тени линии толще, а на солнце - реже и тоньше. А плотность линий пусть зависит только от топологии объекта. Уровень освещенности снимается с объекта при помощи Color Utilites/Surface Luminance. Как теперь связать эту яркость с линиями гравировки? Для этого служит утилита градиента 2Dtexture Ramp.vCoord. Создаем необходимое количество "уровней" градиентной заливки и связываем их с яркостью, так что выход Utilites/Surface Luminance идет на вход 2Dtexture Ramp.vCoord.

Увеличить

Уровням градиента Ramp поставлены в соответствие файлы, содержащие отрезки различной толщины. Тем самым получается этакий полосато-квантованный градиент.

Увеличить

Плотность линий устанавливается в Atribute Editor файлов изменением параметров UV Coord/Repeat UV. Несмотря на то, что толщина отрезков изменяется скачкообразно, на объекте благодаря плавной интерполяции Linear градиента имитируется и плавное изменение толщины линии.
Чтобы получить краевой контур Ink Line, используется прием remapping. Для этого создается условие General Utilites/Condition и General Utilites/SamplerInfo. Все просто! В узле Condition сравниваются первое условие (First Term) со вторым (Second Term) через операцию сравнения (Operation). Если "Да" идем по ветке Color If True, если "Нет" - само собой по Color If False. И вообще это похоже на блок-схему начального урока информатики.

Увеличить


Очень полезно при составлении связей узлов заглядывать в Connection Editor: здравый смысл сразу подсказывает множество конкретных вопросов, на которые можно найти ответ по F1, а то поначалу бывает до того страшно в этих линиях разбираться, что даже непонятно о чем спрашивать.
Далее. Параметр samplerInfo.facingRatio, который и есть ничто иное, как угол нормали поверхности к продольной оси камеры, связывается с condition.firstTerm и сравнивается через Condition/Operation Less Then с заданной величиной condition.secondTerm, задавая толщину краевого контура. Цвет краевого контура - это Condition/Color 1 (вместо нулевых значений, означающим минимальный вклад в RGB, можно вбить любые и получить предпочитаемый цвет). А вот на сondition.сolor2 поступает ramp.outColor с того самого мелированного градиента.
Так получается Surface Shader для горизонтальных линий. Аналогично строится шейдер для вертикальных линий, только с поворотом UV на 90 градусов.

Увеличить

Шкала разбиения градиента тоже меняется чтобы усилить "эффект случайности" хотя бы по толщине линий.
Затем оба фрагмента замешиваются Горизонтальный (Blend Mode Illuminate) поверх Вертикального через Layered Texture в общий Engraving Shader.

Увеличить

Для объектов разной величины и UV плотности можно использовать несколько разных шейдеров, побаловавшись с плотностью линий. Но подергавшись так, начинаешь думать об удобстве пользования: если есть только три объекта, то это нужно модифицировать 3 шейдера объекта * 2 части (вертикальную и горизонтальную) * 8 уровней толщины * 2 атрибута (по U и по V) = 96 полей нужно изменить. А еще краевой контур: Чего-то лень, а лень - великий двигатель. Зачем делать эту тупую работу? Можно создать дополнительный Extra атрибут, отвечающий за изменение всех полей шейдера сразу, или по частям - отдельно для вертикальных и горизонтальных линий. А можно создать Extra атрибуты у самого объекта (предположим, отвечающие и за UV параметры, и за толщину InkLine, и за ее цвет, и за связь угла наклона линий гравировки с яркостью или цветом объекта, и за случайность разброса параметров). Затем написать маленький скриптик по захватыванию значений этих атрибутов самим шейдером, да еще активизировать этот скрипт автоматически, например, в момент Assign Material To Selection.
Список источников:
http://www.siggraph.org/s2002/conference/courses/crs13.html
http://www.iro.umontreal.ca/%7Eostrom/publications/abstracts.html#SIGGRAPH99_gravure
http://graphics.lcs.mit.edu/%7Efredo/
http://www-users.cs.umn.edu/%7Einterran/

Увеличить

Увеличить

Увеличить

Увеличить


372 0 850 1
0
RENDER.RU