Другие 15.09.2020

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге

38 мин.
Содержание
  1. Рисование
  2. Ключевые понятия
  3. Компьютерная графика
  4. Угол к источнику света
  5. Освещение
  6. Окружающее освещение
  7. Направленное освещение
  8. Точечное освещение
  9. Прожекторное освещение
  10. Освещение на плоскости
  11. Объемное освещение
  12. Уменьшение расстояни
  13. Методы интерполяции
  14. Плоскостной шэйдинг
  15. Плавный шэйдинг
  16. Моделирование лица.
  17. Зарождение скульптурирования лица. Первая волна.
  18. Вторая волна скульптурирования лица.
  19. Третья волна скульптурирования лица.
  20. Пятая волна – бейкинг.
  21. Что такое текстуринг и шейдинг и для чего они нужны
  22. С чего начать «оживление» предмета
  23. Маппинг
  24. Рендеринг
  25. Шейдинг-артист
  26. Краткое описание
  27. Особенности профессии
  28. Плюсы и минусы профессии
  29. Плюсы:
  30. Минусы:
  31. Важные качества
  32. Обучение на специалиста по шейдингу
  33. Место работы
  34. Зарплата на 09.07.2020
  35. Карьера
  36. Профессиональные знания
  37. Известные люди этой профессии
  38. Випшейдинг — это стиль или техника?
  39. Фотографии тату с випшейдингом
  40. Популярные сюжеты: цветы и не только
  41. Эскизы для татуировок с випшейдингом
  42. Начинаем писать шейдер
  43. Базовая реализация
  44. Backface culling
  45. Свет и тень
  46. Добавляем контур
  47. Исправляем контур
  48. Корректируем затенение
  49. Используем Vertex Color
  50. Меняем оттенок в тени
  51. Добавляем блик
  52. Исправляем затенение на внутренней стороне
  53. Контролируем толщину контура с помощью Vertex Color
  54. Корректируем нормали на лице
  55. Отбрасываем тень

Рисование

Шэйдинг используется при рисовании для отображения уровней темноты на бумаге путем нанесения красителя или карандаша более плотно или с более темным оттенком для темных областей и менее плотно или с более светлым оттенком для светлых областей. Существуют различные методы шэйдинга, включая штриховку, где перпендикулярные линии разной близости рисуются в виде сетки для затенения области. Чем ближе линии, тем темнее область. Аналогично, чем дальше друг от друга линии, тем светлее область.

Ключевые понятия

Тип нефотореалистичного рендеринга, результатом которого является компьютерное изображение, в некоторой мере имитирующее результат рисования вручную. Cel — сокращение от celluloid (целлулоид — из этого материала делаются прозрачные листы, на которых рисуется традиционная мультипликация). Такой тип рендеринга часто используется для одушевления комиксов, для которых характерны жёсткие контуры, ограниченное число цветов, неплавные переходы светотени.

Итак, ключевые моменты цел-шейдинга:

  • плоская заливка светом;
  • жёсткие границы светотени (отсутствие плавных градиентов);
  • наличие контура.

Компьютерная графика

В компьютерной графике шэйдинг относится к процессу изменения цвета объекта / поверхности / многоугольника в трехмерной сцене на основе таких факторов, как (но не ограничиваясь этим) угол поверхности к источникам света, расстояние от источников света, угол к камере и материал (например, функция распределения двунаправленного отражения) для создания фотореалистичного эффекта. Шэйдинг выполняется в процессе рендеринга программой, называемой шейдером.

Угол к источнику света

Шэйдинг изменяет цвета граней в 3D-модели в зависимости от угла поверхности источника света или источников света.

На первом изображении ниже изображены грани рамки, но все они одного цвета. Здесь также были нарисованы краевые линии, что облегчает просмотр изображения.

Второе изображение – та же модель, изображенная без линий края. Трудно сказать, где заканчивается одна грань фигуры и начинается другая.

На третьем изображении включена функция шэйдинга, что делает изображение более реалистичным и позволяет легче увидеть фигуру.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
Рендеринг изображения коробки. Это изображение не имеет затенения на гранях, но используются линии для разделения граней.ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
То же самое изображение с удаленными линиями.ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
То же самое изображение, полученное с шэйдингом граней, чтобы изменить цвета 3 граней в зависимости от их угла к источникам света.

Освещение

Шэйдинг также зависит от используемого освещения. Обычно при рендеринге сцены используется несколько различных методов освещения, чтобы сделать рендеринг более реалистичным. Различные типы источников света используются для получения различных эффектов.

Окружающее освещение

Источник окружающего света представляет собой всенаправленный источник света с фиксированной интенсивностью и фиксированным цветом, который одинаково влияет на все объекты в сцене. При рендеринге все объекты на сцене становятся ярче с указанной интенсивностью и цветом. Этот тип источника света в основном используется, чтобы предоставить сцене базовый обзор различных объектов в ней. Это самый простой тип освещения, который можно реализовать, и он моделирует, как свет может рассеиваться или отражаться много раз, создавая равномерный эффект.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
Эффекты шэйдинга от прожектора.

Окружающее освещение может быть объединено с окружающим окклюзией, чтобы показать, как экспонируется каждая точка сцены, влияя на количество окружающего света, который она может отражать. Это создает рассеянное ненаправленное освещение по всей сцене, не отбрасывая четких теней, но создавая затененные закрытые и защищенные области. Результат обычно визуально похож на пасмурный день.

Направленное освещение

Направленный источник света освещает все объекты одинаково с заданного направления, как свет области бесконечного размера и бесконечного расстояния от сцены.

Точечное освещение

Свет исходит из одной точки и распространяется во все стороны.

Прожекторное освещение

Свет исходит из одной точки и распространяется в конусе наружу.

Освещение на плоскости

Свет исходит из небольшой области на одной плоскости. Более реалистичная модель, чем точечный источник света.

Объемное освещение

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

Шэйдинг интерполируется на основании того, как угол этих источников света достигает объектов в сцене. Конечно, эти источники света могут быть и часто объединены в сцене. Затем средство рендеринга интерполирует, как эти источники света должны быть объединены, и создает 2-мерное изображение для соответствующего отображения на экране.

Уменьшение расстояни

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

Левое изображение не использует уменьшение расстояния. Обратите внимание, что цвета на лицевых гранях двух коробок одинаковы. Похоже, есть небольшая разница в том, где встречаются две грани, но это оптический обман, вызванный вертикальным краем ниже, где встречаются две грани.

Правильное изображение использует уменьшение расстояния. Обратите внимание, что лицевая поверхность передней коробки ярче лицевой поверхности задней коробки. Кроме того, поверхность пола становится темнее, поскольку он отдаляется.

Этот эффект уменьшения расстояния создает изображения, которые кажутся более реалистичными.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
Две коробки отображаются с помощью рендерера OpenGL. Обратите внимание, что цвета двух передних граней одинаковы, даже если одна коробка находится дальше.
ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
Та же модель, созданная с использованием ARRIS CAD, в которой реализован метод «уменьшения расстояния», чтобы поверхности, которые ближе к глазу, выглядели ярче.

Уменьшение расстояния можно рассчитать несколькими способами:

  • Степень расстояния. Для данной точки на расстоянии x{displaystyle x}
    от источника света интенсивность получаемого света пропорциональна 1/xn{displaystyle 1/x^{n}}
    .
    • Нет (n = 0). Полученная интенсивность света одинакова независимо от расстояния между точкой и источником света.
    • Линейный (n = 1). Для данной точки на расстоянии x от источника света интенсивность принимаемого света пропорциональна 1 / x.
    • Квадратичный (n = 2) – это то, как интенсивность света в действительности уменьшается, если у света есть свободный путь (то есть нет тумана или любой других веществ в воздухе, которая может поглощать или рассеивать свет). Для данной точки на расстоянии х от источника света интенсивность принимаемого света пропорциональна 1/x2{displaystyle 1/x^{2}}
      .
  • Можно также использовать любое количество других математических функций.

Методы интерполяции

При расчете яркости поверхности во время рендеринга наша модель освещения требует, чтобы мы знали нормаль поверхности. Однако 3D-модель обычно описывается полигональной сеткой, которая может хранить нормаль поверхности только в ограниченном количестве точек, обычно либо в вершинах, либо на гранях полигона, либо в обеих. Чтобы обойти эту проблему, можно использовать один из нескольких методов интерполяции.

Плоскостной шэйдинг

Здесь цвет рассчитывается для одной точки на каждом многоугольнике (обычно для первой вершины в многоугольнике, но иногда используется центроид для треугольных сеток) на основе нормальной поверхности многоугольника и предположения, что все многоугольники плоские. Затем в любом месте цвет интерполируется путем окрашивания всех точек на многоугольнике так же, как и точки, для которой был рассчитан цвет, что дает каждому многоугольнику однородный цвет (аналогично, интерполяции методом ближайшего соседа). Обычно эта техника используется для высокоскоростного рендеринга, где более продвинутые методы шэйдинга слишком дороги в вычислительном отношении.

 В результате плоскостного шэйдинга все вершины многоугольника окрашиваются в один цвет, что позволяет различать соседние многоугольники. Зеркальные блики плохо отображаются с плоскостным шэйдингом: если в репрезентативной вершине имеется большой зеркальный компонент, эта яркость равномерно рисуется по всей грани. Если зеркальная область не попадает в репрезентативную точку, оно полностью пропускается. Следовательно, компонент зеркального отражения обычно не включается в вычисление плоскостного шэйдинга.

Плавный шэйдинг

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

Типы плавного шэйдинга включают в себя:

  • Гуро шэйдинг.
  • Фонг шэйдинг.

Моделирование лица.

Начну с того, что существует профессиональное понятие, как моделирование лица, и оно имеет немного разное значение для визажиста и художника по гриму.

Моделирование лица с точки зрения визажиста – это с помощью светлых и темных тонов моделируют лицо с целью конкретизации его форм и деталей (нос, лоб, подбородок, глаза…) и их коррекции при необходимости. То есть, это моделирование преобразит ваше лицо, но не изменит его, вас по- прежнему  будут узнавать друзья и знакомые.

Моделирование лица с точки зрения гримера– это изменение черт лица, создание образа и характера с помощью живописного метода, а именно используя правила цветометрии, законы живописи о цвете, свете, светотенях. То есть, лицо становится объемным холстом, на котором можно рисовать и создавать новое лицо.

В профессиональном мире существует 3 вида моделирования:

— жирное, когда используются жидкие и жирные материалы;

— сухое, когда используются сухие материалы;

— смешанное, когда применяются сухие и жирные материалы.

Зарождение скульптурирования лица. Первая волна.

Контуринг и скульптурирование — эти два слова обозначают моделирование лица тональными средствами и появились они не вчера, а еще в 30-е годы XX века. Именно благодаря кино и Голливудским стандартам красоты, которые доводили до совершенства с помощью макияжа, были сформулированы основные принципы моделирования. Конкретизация форм лица была необходима, так как пленка того времени сильно искажала цвета, сглаживала тени и делала лицо без грима невыразительным. Схожие проблемы возникали в театре со сценическим гримом.

Примером созданной ангельской симметрии была Грета Гарбо, ее прекрасное лицо было тщательно отполировано гримерами.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге

Желание довести каждое лицо до совершенства побудило Макса Фактора в 1934 году создать аппарат Beauty Calibrator – это железная маска с множеством винтиков, которая позволяла измерять параметры лица и выявлять его несовершенства.
Фактор предложил новую теорию красоты, в которой длина носа должна быть равна высоте лба, а расстояние между глазами быть не больше, чем размер одного глаза. Маска позволяла составить схему лица и потом с помощью косметики с точностью до миллиметра устранить асимметрию.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге

В  таком подходе есть и существенные недостатки, нельзя подгонять лицо под законы математики и геометрии. Иначе все лица становятся похожими друг на друга, человек теряет индивидуальность.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге

Уже стало закономерностью, после каждого этапа истории с невероятным стремлением к идеальной красоте, модными становятся лица далекие от признанных стандартов.

И таких примеров  множество: Барабара Стрейзант, Лайза Минелли, Бэтт Мидлер, Сара Джессика Паркер, Эми Уйанхаус, Леди Гага.

Вторая волна скульптурирования лица.

Вторая мощная волна скульптурирующего макияжа пришлась на 70-е годы XX века, когда женщине было важно выглядеть на миллион, но по-деловому, без ярких теней и румян. А своего пика увлечение контурингом достигло в 1980-е, в эпоху супермоделей. Читатели глянцевых журналов были в восторге от ярких черт, пропорциональных лиц Линды Евангелисты, Кристи Терлингтон, Наоми Кэмпбелл.

Похожее изображение

Мало кто знает, что до эталона по лекалам Макса Фактора их довел американский визажист Кевин Окоин. Именно он перенес техники кино-грима в модную индустрию и адоптировал их под особенности освещения на подиумах и фотосъемках. Кевин был звездой своего времени: слава пришла к нему после того, как он стал вести колонку в журнале о красоте Allure и написал книгу  «Face FORWARD». Контуринг стали широко использовать все визажисты без исключения, но обычные женщины мало что знали о нем и не применяли.
Картинки по запросу кевин окоин

Третья волна скульптурирования лица.

 Четвертая волна – стробинг (хайлайтинг).

Так как жесткий контуринг быстро стал терять популярность, из-за сложности выполнения и все кто «жаждал», уже приобрели необходимые  средства. То нужно было  что-то еще придумать или преподнести, как нечто новое. Поэтому в 2015 году появился новый тренд — СТРОБИНГ (ХАЙЛАЙТИНГ).

Стробинг — это техника макияжа, при которой предпочтение отдается прежде всего светлым материалам (светлые тени, невесомые пудры, кремовые продукты – хайлайтеры). Высветляются  все выпуклые части лица (скулы, внутренние уголки глаз, подчеркивается изгиб брови, центр лба, спинка носа, “галочка” над верхней губой, подбородок с целью придать им максимальное естественное сияние.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге

Но, в макияже должно соблюдаться равновесие между светлыми и темными оттенками, поэтому чистого стробинга в носибельном макияже не существует.

Предложение выделять все выпуклые части лица тоже несет больше вреда, чем пользы. Что делать если нос длинный, кривой, с горбинкой…? А если лоб и без того широкий, а подбородок выступает вперед? И таких «если» можно привести еще очень много. Возникает вопрос: «Это техника для людей с идеальными, пропорциональными и симметричными  лицами?»

Рекламные фото со сторобингом выглядят интересно, но основная задача этого нового тренда, познакомить, как можно большее количество женщин с хайлайтерами и конечно продать их.

 ПРАВДА о контуринге, стробинге, шейдинге и бейкинге

Безусловно, вы можете использовать некоторые элементы стробинга, но надо знать какие, в каждом конкретном случае.

Пятая волна – бейкинг.

Все что пишется о бейкинге и его невероятном волшебстве – это просто бред, не верьте! Это часть обычного сухого моделирования лица, о котором я говорила в начале статьи. Правдой является только то, что прием этот взят у профессиональных гримеров. Для обычных женщин и девушек, и тем более, которые не имеют модельную внешность — он сложен и нет необходимости его вообще применять.

Картинки по запросу kevyn aucoin тина тернер
large[1]

Бейкинг применял уже хорошо вам известный Кевин Окоин, особенно когда он работал с чернокожими женщинами на фотосъемках. Этот прием позволял очень сильно изменить их природные черты лица. Узнаете на фото Тину Тернер?

Цель у всего этого действия одна – это продать вам транспарантную (прозрачную) пудру, потому что появилась целая армия маньяков макияжа и псевдо визажистов.

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

Стробинг и бейкинг не является на самом  деле даже техникой – это как текст, вырванный из контекста.

Я уверена, что в ближайшее время опять придумают «новую технику». Но, для вас важно понимать, что существует два разных подхода к макияжу:

  1. практичный – носибельный макияж, соответствующий вашему образу жизни и ситуациям.
  2. профессиональный – макияж, который создает образ, воплощает художественный замысел исполнителя и соответствует специфическим условиям применения.

Что такое текстуринг и шейдинг и для чего они нужны

Текстурирование в программе Autodesk Mudbox 
Текстурирование в программе Autodesk Mudbox 
Текстуринг – это создание текстур (фактуры, рисунка, мелкого объёма, цвета) на виртуальной 3D модели. Шейдинг – процесс, осуществляемый с помощью с шейдера – программы, применяемой в трёхмерной графике для определения окончательных параметров объекта или изображения. Шейдер может включать описание поглощения и рассеивания света произвольной сложности, наложения текстуры, отражение и преломление, затемнение, смещение поверхности и эффекты пост-обработки. Программируемые шейдеры очень эффективны и позволяют при помощи простых геометрических форм визуализировать сложные с виду поверхности.
Иллюстрация – сборка шейдера без текстур средствами Maya
Сборка шейдера без текстур средствами Maya  

С чего начать «оживление» предмета

Предположим, выдан объект. К нему, если работа предстоит на студии, обычно предоставляется эскиз или скетч. В зависимости от задания, модель затекстурить можно разными способами, например – полностью «раскрасить» в одной из программ для текстуринга (Autodesk Mudbox,The Foundry MARI, ZBrush, CINEMA 4D Studio,3d coat), используя различные инструменты из палитры.

Программа для текстуринга ZBrush

Программа для текстуринга ZBrush

Программа для текстуринга The Foundry Mari

Программа для текстуринга The Foundry Mari

После этого необходимо выгрузить текстурные карты (картинки).

Карта текстур
Нарисовать, склеить и смонтировать карты можно и в сторонней программе, например в 2D программе Photoshop.

ПРАВДА о контуринге, стробинге, шейдинге и бейкинге
Зашейдить объект и без использования текстур можно, полностью заменив все карты процедурными шейдерами уже в Autodesk Maya или Max.  

Маппинг

На следующем этапе необходимо «размапить» объект. Маппинг – это создание виртуальной выкройки объекта текстурирования. Делать его можно разными способами и в разных программах, например – headus UVLayout.
Маппинг в программе UVLayout

Основной принцип маппинга – делать разрезы в максимально невидимых для зрителя местах (за ушами, волосами, под кантом). При «раскрашивании» кистями вручную, по большому счету, неважно, где находится шов – он закрасится. Однако на швах могут быть баги, «потянутости», поэтому лучше швы прятать, тогда в итоге будет меньше мороки. Вообще, качественные выкройки – залог наилучшего результата.
Для раскрашивания объектов можно использовать и карты, созданные в 2D программе или фото, которые будут проецироваться на модель в 3D пространстве и обрисовываться по форме.
Впрочем, такие текстуры можно использовать и не рисуя ими по объекту. Тогда они будут смешиваться сразу в шейдере. Для этого создается тайловая карта, которая может повторяться любое количество раз, состыковываясь сама с собой с любой стороны. Важно помнить, что в данном случае маппинг должен быть идеальным, все швы в нужных местах должны быть скрыты. Иначе тайл сразу выдаст несостыковку, и направления текстур не совпадут.   Существуют способы автоматического маппинга. В данном случае программа выбирает на свое усмотрение, где делать рез, из-за чего есть вероятность, что будут заметны стыки карт в нежелательных местах. Однако в ряде шейдеров с однородным материалом, где не обязательны карты (например, в чистом стекле или пластмассе), швы не будут видны. В таких случаях маппинг может и вовсе не пригодится.
Для создания шейдера может понадобиться несколько карт для разных параметров. Карты могут быть как в градациях серого, так и цветные, в зависимости от назначения: карта цвета (diffuse, color), рельеф (bump, displacement), карты отражения, преломления, поглощения света (reflection, refraction, specular) и многие другие – зависит от сложности задачи.
Карта цвета

Рендеринг

Когда готовы карты, можно собирать шейдер-материал объекта и рендерить, то есть считывать картинку.
Рендеринг
Рендерить можно в разных программах: RenderMan,V-Ray, Arnold Renderer или mental ray. По сути своей все рендеры схожи, но у каждого есть свои особенности. Есть ряд параметров, на которые можно цеплять карты или настраивать сами по себе. Существуют параметры константные, которые настраиваются в определенном интервале без карт цифровыми значениями (например, от 0 до 1), и вариативные, имеющие несколько критериев, которые в том числе могут быть взяты из карты. Для того чтобы увидеть итоговый результат при рендеринге наиболее точно, нужно всегда помнить про источники света.
 
Сейчас в интернете можно найти много уроков по вариантам и способам маппинга, текстуринга, шейдинга, ведь существует множество сочетаний использования функций программ. По настройкам материалов существуют как уроки, так и таблицы с известными точными цифровыми значениями физически корректных параметров.
Учиться и углубляться в эту область можно постоянно – сфера компьютерной графики постоянно развивается, придумываются все более совершенные способы реализации самых безумных идей. Главное – не терять желание!

Шейдинг-артист

Шейдинг-артист должен обладать навыками классического рисования и художественного восприятия. Профессия востребованная и быстроразвивающаяся в условиях современного технического прогресса. Искусство (музыка, театр, кино, изобразительное искусство) Плюсы и минусы профессии Важные качества Где учиться Зарплата на 09.07.2020

Шейдинг-артист работает над реалистичностью материалов, настраивая их отображение в виртуальной среде. Его задача — настройка шейдеров и света. Профессия подходит тем, кого интересует рисование и мировая художественная культура (см. выбор профессии по интересу к школьным предметам).

Краткое описание

Мастер по шейдингу — это специалист, который без труда сможет добавить свет или выполнить затемнение 3D символов в конкретной картинке или видеоряде. При создании таких эффектов он должен отталкиваться от технических требований, установленных в конкретном проекте. Если требований нет, тогда он должен основывать свои действия на собственном художественном виденье.

Особенности профессии

Тень, прозрачность, полупрозрачность, рассеивание или направленность света, его яркость в определенных условиях может меняться. Основным фактором, который влияет на изменение вышеперечисленных свойств, является окружающая среда. Так, свет от объекта зависит от его величины, материала, из которого он изготовлен, текстуры (шероховатости или гладкости), цвета объекта и других особенностей. Все это и множество других нюансов называется физически корректным шейдингом. Его обязан не просто знать, а уметь создавать специалист по шейдингу.

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

Плюсы и минусы профессии

Как и в каждой другой профессии, шейдинг мастер может столкнуться с положительными и негативными сторонами специальности.

Плюсы:

  • интересная работа (всегда разные проекты, которые не повторяются);
  • высокооплачиваемая сфера занятости;
  • востребованная специализация в киноиндустрии, медиапространстве;
  • комфортные условия работы (удаленно на дому или в офисе компании);
  • международная профессия (освоив программы для создания визуальных эффектов, можно работать в них как в России, так и за рубежом).

Минусы:

  • длительное обучение (минимум 2 года);
  • высокая нагрузка на зрение (разработка эффектов проводится на компьютере);
  • необходимость уделять работе большое количество времени, из-за чего время на развлечения и семь резко сокращается;
  • отсутствие штампов и стандартов в специализации (иногда видение результата мастером и заказчиком будет отличаться, необходимо в этом случае проявить сдержанность и «подстроиться» под желания заказчика);
  • регулярное расширение навыков (сфера визуализации 3D эффектов не стоит на месте, поэтому следует активно пополнять собственный багаж знаний, совершенствоваться).

Важные качества

Каждый специалист по шейдингу должен:

  • уметь оперативно организовывать собственную работу;
  • взаимодействовать с другими специалистами (в первую очередь с текстурным художником);
  • обладать художественным вкусом и «чутьем», четко определять степень реализма, необходимую для художественного направления конкретного проекта;
  • быть усидчивым, так как создание этой части 3D анимации — дело кропотливое;
  • внимательно относиться к художественным деталям;
  • иметь отличное чувство света, цвета, композиции;
  • обладать аналитическим мышлением;
  • уметь быстро обучаться.

Обучение на специалиста по шейдингу

Современный шейдинг-артист — профессия, которая не так давно стала популярной и востребованной, поэтому такой специальности в ВУЗах пока нет. Однако существуют альтернативные варианты обучения, которые помогут в совершенстве овладеть профессией:

Место работы

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

Зарплата на 09.07.2020

Москва 50000—80000 ₽

Специалист по шейдингу может получать от 100$ за проект или в среднем за месяц около 40000 — 75000 рублей. Все зависит от сложности работы и сроков ее выполнения. Максимальной зарплатной границы не установлено, поэтому став хорошим специалистом, можно получать высокооплачиваемый доход.

Карьера

Свою карьеру представитель этой профессии может начать с самого легкого — фрилансерства, выполняя один за другим небольшие вакантные проекты. При таком выборе специалист по шейдингу сам подстраивает собственный ритм жизни к работе, т.е. принимает участие в разработке 3D анимации тогда, когда он свободен.

После некоторого времени получения опыта и создания собственного портфолио, шейдинг-художник может участвовать в более серьезных проектах: в создании фильмов, сериалов, к примеру, став сотрудником на постоянной основе в анимационной студии кино. Кроме того, специалист по шейдингуможет работать над одним из этапов создания рекламы, компьютерных, мобильных, браузерных или социальных игр и т. д.

Рост в карьере зависит от личных качеств, скорости освоения навыков новой профессии. Поэтому определенных пределов и границ в карьере у специалиста по шейдингу не существует.

Профессиональные знания

В первую очередь шейдинг-артист должен иметь навыки классического рисования, поэтому начинать нужно с этого. Далее он должен иметь представление и базовые знания в области моделирования. После освоения этого, чтобы оперативно справляться с поставленными профессиональными задачами, специалист по шейдингу должен хорошо знать следующие программы «MUDBOX», «PHOTOSHOP», «3ds Max», «V-Ray», «Mantra», «Arnold» и др.

Известные люди этой профессии

Представленную профессию можно отнести к категории «за кадром», так как специалисты принимают участие в создании многих глобальных проектов, однако они — остаются неизвестными. Из-за того, что художники по шейдингу создают лишь часть готовой 3D анимации, конечный потребитель может об их работе часто не догадываться. Поэтому большой известностью шейдинг-художники не пользуются. Однако на их востребованность это никак не влияет.

Випшейдинг — это стиль или техника?

Начнём с теории, потому как без неё будет сложно понять, что это такое. «Вип шейдинг» (перенос с английского) или по-английски «whip shading» — это техника, а не художественный стиль.

«Whip» переводится как кнут, а «shading» — нанесение теней или затенение. Випшейдинг — это техника создания татуировки с помощью так называемой «штриховки», похожей на нанесение штриха карандашом на бумаге. Линия в випшейдинге начинается достаточно толсто, постепенно утончается, переходит в точки и потом в ничто.

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

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

Випшейдинг — не стиль, а техника нанесения. Его можно добавить в любую татуировку, кроме, пожалуй, акварели. Хотя нет, даже в акварель можно.
Випшейдинг иногда путают с дотворком (подвидом графики) или чёрно-белым реализмом, но их довольно просто отличить. В дотворке точки — определяющий элемент, они должны быть заметны, а в чёрно-белом реализме предметы нарисованы как в жизни, со всеми изгибами, текстурами, объёмами, а не схематично точками, линиями и штрихами.

Понимаем, сложно. Иногда даже мастера затрудняются сказать, что они видят — дотворк, випшейдинг, классическую графику или гравюру. Попробуем объяснить картинками. Вот чёрно-белый випшейдинг:

А вот випшейдинг с цветом. Есть миф, что випшейдинг делается только в чёрно-белых татуировках, но это не так. Для него нужны контрастные оттенки — это правда.

Видите штрихи и тени? Татуировки в випшейдинге отличают плавные переходы от тёмному к светлому, затемнение отдельных участков рисунка, едва заметные упорядоченные штрихи. С этим сложно: штрихи должны быть чёткими, но при этом не бросаться в глаза, как в классической гравюре, или как точки дотворке (нанесение татуировки точками), где эти элементы играют важную роль. Вы должны видеть форму, объём, переходы, изгибы, но не то, как они сделаны, не «материал».

А вот дотворк. Присмотритесь и увидите маленькие чёткие точки, наполняющие татуировку:

Фотографии тату с випшейдингом

Что рисуют с випшейдингом? Да что угодно. Трудности могут возникнуть со сложными реалистичными сюжетами, но даже это реализуемо.

Можно нарисовать персонаж из мультика, цветы, скульптуру, сцену из сказки, веточку или монстра:

Можно сделать вполне серьёзные рисунки:

Популярные сюжеты: цветы и не только

Возможно, самый популярный сюжет с випшейдингом — это цветы: пионы или розы, которые чаще всего наносят на ноги, плечи и руки.

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

Часто с помощью випшейдинга изображают людей.

Очень эффектно выходит всякая монстрятина и твари, что совершенно понятно: тени усиливают мрачный образ.

Эскизы для татуировок с випшейдингом

Акварель с випшейдингом. Весьма необычно для этого стиля:

Графика с випшейдингом — это классика:

Смесь випшейдинга с дотворком в графике:

И ещё несколько интересных рисунков, сделанных нашими мастерами:

Вот ещё интересные идеи, что можно было бы сделать с випшейдингом:

  • Космос. Его обычно рисуют в реализме, строгой геометричной графике или акварели. С випшейдингом он будет смотреться очень необычно, обещаем.
  • Известная картина. Возьмите мировой шедевр — «Сотворение Адама» или «Мону Лизу», или «Апофеоз войны». С штрихами и графичными тенями он будет выглядеть совсем иначе.
  • Портрет. Лица людей с випшейдингом приобретают особый шарм, резкость, характер. Попробуйте.
  • Еда. Мороженка, стейк, пицца или дыня.

Начинаем писать шейдер

Сразу оговорюсь, я не буду подробно разжёвывать синтаксис шейдерного языка HLSL и CG, потому что это тема для отдельной статьи, плюс на эту тему уже есть достаточно туториалов и мануалов. Я буду объяснять только то, что касается именно реализации цел-шейдинга.

Есть несколько основных подходов к написанию шейдеров. Некоторые предпочитают за основу брать Surface-шейдер, некоторые — Unlit-шейдер. Я покажу реализацию на основе Unlit-шейдера, который по умолчанию не использует никакую модель освещения. Освещение в цел-шейдинге достаточно простое, по этому мы напишем свою упрощенную модель, чтобы не тратить лишние ресурсы на рассчёт более сложного освещения, которое нам не нужно.

Итак, открываем Unity и создаем Unlit Shader…

Базовая реализация

При создании шейдера, Unity по умолчанию добавляет туда поддержку тумана. В нашем случае он не нужен, по этому давайте удалим все строки, связанные с туманом, в качестве небольшой оптимизации.

// make fog work #pragma multi_compile_fog UNITY_FOG_COORDS(1) UNITY_TRANSFER_FOG(o,o.vertex); // apply fog UNITY_APPLY_FOG(i.fogCoord, col);

Создаем на основе шейдера материал, назначаем текстуру и применяем материал к нашей модели.

​Получили плоскую заливку без освещения

Backface culling

У нашего персонажа имеются односторонние поверхности, например волосы и набедренная повязка. Они корректно отображаются с внешней стороны, но невидимы с внутренней. Давайте это исправим и сделаем наш материал двухсторонним. Для этого нужно добавить Cull Off в начале Pass. Должно получиться вот так.

Pass { Cull Off // Добавляем эту строку CGPROGRAM #pragma vertex vert #pragma fragment frag ​Слевы — было, справа — стало. Теперь можно видеть тыльную сторону меша

Свет и тень

Наша модель будет учитывать освещение только от одного основного направленного источника света (Directional Light). Чтобы избежать лишних вычислений на графическом процессоре, добавим Pass Tags, которые будут накладывать описанное выше ограничение.

Pass { Tags { “LightMode” = “ForwardBase” “PassFlags” = “OnlyDirectional” } Cull Off

Нам нужно знать насколько сильно будет затеняться поверхность, на которую не попадает свет (мы же не хотим, чтобы она была идеально чёрной). Для этого добавим свойство _ShadowStrength.

Properties { _MainTex (“Texture”, 2D) = “white” {} _ShadowStrength (“Shadow Strength”, Range(0, 1)) = 0.5 // Добавляем

При этом в инспекторе материала появится слайдер, с помощью которого мы можем регулировать степень затенения.

​По умолчанию поверхность в тени будет на 50% темнее, чем поверхность на свету.

Также надо добавить эту переменную в тело CGPROGRAM.

sampler2D _MainTex; float4 _MainTex_ST; float _ShadowStrength; // Добавляем эту строку

Чтобы определить, какая часть поверхности будет в тени, а какая на свету, нам нужно знать направление нормали поверхности. Unity предоставляет нам эту информацию, но чтобы получить её, нужно «сказать» об этом в appdataи в v2f struct.

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal : NORMAL; // Добавляем эту строку }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldNormal : NORMAL; // Добавляем эту строку };

Добавим в vert функцию преобразование нормали поверхности из локальных координат в мировые:

v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldNormal = UnityObjectToWorldNormal(v.normal); // Добавляем эту строку return o; }

Теперь добавим в функцию fragкод, который будет считать затенение.

fixed4 frag (v2f i) : SV_Target { // Нормализуем вектор нормали, чтобы его длина равнялась 1 float3 normal = normalize(i.worldNormal); // Считаем Dot Product для нормали и направления к источнику света // _WorldSpaceLightPos0 – встроенная переменная Unity float NdotL = dot(_WorldSpaceLightPos0, normal); // Cчитаем интенсивность света на поверхности // Если поверхность повернута к источнику света (NdotL > 0), // то она полностью освещена. // В противном случае учитываем Shadow Strength для затенения float lightIntensity = NdotL > 0 ? 1 : _ShadowStrength; // sample the texture fixed4 col = tex2D(_MainTex, i.uv); // Применяем затенение col *= lightIntensity; return col; }

Результат.

​Слева — без затенения, справа — с затенением

Степень затенения можно регулировать слайдером. В моём проекте персонаж всегда освещается одинаково, по этому я не учитываю цвет источника света, а также ambient-освещение. Если вам интересно, как реализовать добавление цвета источника света, ambient, а также контурный свет, рекомендую это статью (на английском).

Добавляем контур

Контур также можно реализовать несколькими способами. Самые распространённые — post-effect и inverted hull.

Пост-эффект затрагивает все изображение на экране. В моём проекте я хочу иметь возможность разделять, какие объекты будут отображаться с цел-шейдингом, а какие нет. По этому для себя я выбрал inverted hull метод.

Для начала добавим переменную _OutlineWidth, которая позволит нам регулировать толщину контура в инспекторе.

Properties { _MainTex (“Texture”, 2D) = “white” {} _ShadowStrength (“Shadow Strength”, Range(0, 1)) = 0.5 _OutlineWidth (“Outline Width”, Range(0, 0.1)) = 0.01 // Добавляем }

Контур будет рисоваться отдельным Pass. Код в нём достаточно простой, по этому всё описание будет в комментариях к коду.

Добавляем следующий код сразу после закрытия фигурной скобки первого Pass.

Pass { // Скрываем полигоны, повернутые к камере Cull Front CGPROGRAM #pragma vertex vert #pragma fragment frag #include “UnityCG.cginc” struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 vertex : SV_POSITION; }; // Объявляем переменные half _OutlineWidth; static const half4 OUTLINE_COLOR = half4(0,0,0,0); v2f vert (appdata v) { // Смещаем вершины по направлению нормали на заданное расстояние v.vertex.xyz += v.normal * _OutlineWidth; v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag () : SV_Target { // Все пиксели контура имеют один и тот же цвет return OUTLINE_COLOR; } ENDCG }

Результат.

Вот мы и закончили базовую реализацию цел-шейдинга. Можно было бы на этом остановиться, если бы не несколько критичных моментов, которые ломают всю картину… Давайте их обозначим и исправим.

Исправляем контур

При более близком рассмотрении можно заметить множество артефактов, созданных контуром.

​Тысячи их…

В основном все артефакты связаны с тем, что контур «залезает» на основной силуэт. При этом внешний контур получился достаточно неплохо. Давайте сделаем так, чтобы контур рисовался только снаружи основного силуэта и никогда не «залезал» внутрь. Для этого используем Stencil buffer.

Добавьте следующий код в первый Pass, в котором мы рисуем основной силуэт, между Cull Off и CGPROGRAM.

Stencil { Ref 1 Comp Always Pass Replace }

По умолчанию, значение Stencil для всех пикселей равно 0. Код, который мы написали, сравнивает значение пикселя со значением Ref, в данном случае с 1.

Comp Always означает, что проверка всегда проходится с положительным результатом, при этом не важно, значение больше, меньше или равно.

Pass Replace означает, что если проверка прошла успешно, то значение Stencil для данного пикселя заменяется значением Ref.

По сути, для всех пикселей основного силуэта мы принудительно переписали значение Stencil на 1.

Теперь добавим следующий код во второй Pass, который рисует контур. При этом заменим Cull Front на Cull Off, чтобы в формировании силуэта принимали участие все полигоны, а не только те, которые отвернуты от камеры.

Cull Off Stencil { Ref 1 Comp Greater }

Таким образом, будут рендериться только те пиксели, для которых значение Ref (в нашем случае 1), больше, чем значение в буфере. Для пикселей основного силуэта мы присвоили значение 1, а значит проверка на «больше» не пройдёт и пиксели отображаться не будут.

​Слева — без Stencil, справа — со Stencil

Теперь контур выглядит гораздо чище и не создает артефактов внутри основного силуэта.

Но есть ещё одна проблема.

Контур «живет» в пространстве игрового мира, а не в пространстве экрана. Поэтому при приближении камеры толщина его пропорционально увеличивается и, если показывать персонажа крупным планом, то контур будет слишком толстым.

Также толщина контура может меняться, в зависимости от угла наклона поверхности и направления взгляда.

​Пример изменения толщины контура, в зависимости от угла наклона поверхности VIDEO POETICS

Обе проблемы решаются переносом рассчета контура в clip space(пространство экрана).

Заменим код в фунции vert на следующий.

v2f vert (appdata v) { // Конвертируем положение и нормаль вертекса в clip space float4 clipPosition = UnityObjectToClipPos(v.vertex); float3 clipNormal = mul((float3x3) UNITY_MATRIX_VP, mul((float3x3) UNITY_MATRIX_M, v.normal)); // Считаем смещение вершины по направлению нормали. // Также учитываем перспективное искажение и домножаем на компонент W, // чтобы сделать смещение постоянным, // вне зависимости от расстояния до камеры float2 offset = normalize(clipNormal.xy) * _OutlineWidth * clipPosition.w; // Т.к. рассчет теперь ведется в пространстве экрана, // надо учитывать соотношение сторон // и сделать толщину контура постоянной при любом aspect ratio. // _ScreenParams – встроенная переменная Unity float aspect = _ScreenParams.x / _ScreenParams.y; offset.y *= aspect; // Применяем смещение clipPosition.xy += offset; v2f o; o.vertex = clipPosition; return o; }

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

Если Вам интересно узнать больше о технике Inverse hull outline, какие могут возникнуть проблемы, как их решить, а также как сделать pixel perfect outline рекомендую эту статью (опять же, на английском).

Корректируем затенение

У нашего персонажа есть затенённые зоны, но они выглядят очень плоско и, из-за невысокой детализации меша, не подчёркивают некоторые детали. Также отсутствует эффект ambient occlusion (дополнительное затенение в тех местах, куда трудно проникает свет).

Чтобы модель выглядела более реалистично, нужно добавить тени:

  • в складках шарфа и одежды;
  • в подмышечной зоне;
  • вокруг мускулов на руках, чтобы подчеркнуть рельеф мускулатуры;
  • на голове под волосами.

Часть из этого можно реализовать, добавив Normal Map текстуру. При этом, для начала, придётся сделать высокополигональную модель, запечь с неё текстуру нормалей, добавить поддержку текстуры нормалей в шейдер.

Такой подход заметно «удорожает» процесс разработки и при этом не решает проблему отсутствия ambient occlusion. И что делать, если мы не хотим использовать дополнительные ресурсы и дополнительные текстуры, чтобы сэкономить память системы?

Используем Vertex Color

Альтерантивным решением будет использование цвета вершин (vertex color). Основу этой техники я подсмотрел в докладе на GDC, в котором технический художник Arc System Works рассказал о пайплайне создания персонажей для Guilty Gear. Всем, кому интересен процесс создания стилизованных персонажей, смотреть обязательно.

Итак, для каждой вершины меша у нас есть 3 цветовых канала, которые могут принимать значение от 0 до 1 и в которые мы можем закодировать определённые данные.

Для себя я выбрал следующее.

  • КРАСНЫЙ — отвечает за затенение. Значение по умолчанию 0,5. Чем ниже значение, тем быстрее поверхность уйдёт в тень, даже если нормаль всё ещё «смотрит» в направлении источника света. При значении равном 0, поверхность в этой точке ВСЕГДА будет в тени, даже если на неё падает прямой луч света. Если значение выше 0,5, то поверхность в этой точке будет оставаться освещённой, даже если нормаль уже «отвернулась» от источника света. При значении равном 1, поверхность будет всегда освещена, даже если она отвернута от источника света на 180 градусов.
  • ЗЕЛЁНЫЙ— отвечает за размер блика. Значение по умолчанию 0. Про то, как добавить блик, расскажу чуть позднее. В целом, если значение равно 0, то блик отсутствует. Значения между 0 и 1 задают размер блика (чем значение больше, тем блик меньше).
  • СИНИЙ — отвечает за толщину контура. Значение по умолчанию 1. Если мы хотим сделать контур более тонким для некоторых частей персонажа (например, на тонких объектах типа пальцев или волос, чтобы не терять детализацию) мы можем задать синему каналу значение 0,5 и тогда контур в этой области будет в 2 раза тоньше. Этот параметр может сделать контур тоньше или вообще убрать его (если значение 0), но не может сделать его толще.

В теории, можно ещё использовать альфа-канал, но я пока не нашел ему хорошего применения, мне достаточно трёх.

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

Мой персонаж после покраски выглядит так.

Можно легко увидеть, что синим цветом прокрашены зоны, которым нужно дополнительное затенение (складки ткани, мышцы и так далее). Синий цвет означает, что там отсутствует блик (зеленый канал = 0) и что порог затенения тоже очень низкий (красный канал либо = 0, либо очень низкое значение), при этом толщина контура сохраняется (синий канал = 1).

Теперь нужно добавить поддержку vertex color в наш шейдер.

Добавим соответствующие строки в appdata,v2fи vert.

struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal : NORMAL; half4 color : COLOR; // Добавляем эту строку }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldNormal : NORMAL; half4 color : COLOR; // Добавляем эту строку }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.color = v.color; // Добавляем эту строку return o; }

Теперь обновляем код для фунцкции frag:

fixed4 frag (v2f i) : SV_Target { // Нормализуем вектор нормали, чтобы его длина равнялась 1 float3 normal = normalize(i.worldNormal); // Считаем Dot Product для нормали и направления к источнику света // _WorldSpaceLightPos0 – встроенная переменная Unity float NdotL = dot(_WorldSpaceLightPos0, normal); // Пересчитываем NdotL, чтобы он был в диапазоне от 0 до 1, // чтобы сравнивать его со значением красного канала float NdotL01 = NdotL * 0.5 + 0.5; // Т.к. пороговое значение для затенения теперь может быть разным // для разных пикселей, мы рассчитываем маску, // по которой будем затенять пиксели. // Используем step функцию и красный канал в качестве порогового значения. // “1 – step” инвертирует маску. По умолчанию у нас 1 в освещенной зоне, // а 0 в затенённой. Нам же надо иметь 1 в затенённой зоне (маска). half shadowMask = 1 – step(1 – i.color.r, NdotL01); // Получаем цвет с текстуры fixed4 texCol = tex2D(_MainTex, i.uv); // Применяем затенение по маске half4 shadowCol = texCol * shadowMask * _ShadowStrength; // Смешивем цвет текстуры (освещенная часть) и цвет тени по маске half4 col = lerp(texCol, shadowCol, shadowMask); return col; }

Теперь, вместо простого lightIntensityмы используем более сложную маску тени (shadow mask) на основе красного канала.

Результат.

​Слева — без учёта красного канала, справа — с учётом красного канала

Меняем оттенок в тени

Сейчас в затенённой зоне у нас меняется лишь интенсивность цвета, при этом оттенок остаётся тем же самым. Но что если мы хотим сделать тени более «холодными»? Или скорректировать цвет, в зависимости от окружения?

Можно добавить поддержку Ambient Light, как описано в этой статье, а можно задавать изменение оттенка вручную.

Чтобы задать оттенок тени вручную, нам нужно поменять 3 строки.

Заменить свойство _ShadowStrength на _ShadowTint.

Properties { _MainTex (“Texture”, 2D) = “white” {} _ShadowTint(“Shadow Tint”, Color) = (1,1,1,1) // Заменяем тут _OutlineWidth (“Outline Width”, Range(0, 0.1)) = 0.01 }

Объявить новую переменную в теле CGPROGRAM.

sampler2D _MainTex; float4 _MainTex_ST; half4 _ShadowTint; // Заменяем тут

Заменить строку в функции frag.

// Применяем затенение по маске half4 shadowCol = texCol * shadowMask * _ShadowTint;

Теперь в инспекторе можно выбрать более «холодный» оттенок, чтобы добиться желаемого эффекта.

Слева — без изменения оттенка тени, справа — с изменением оттенка.

Добавляем блик

Для создания блика мы реализуем модель Blinn-Phong, которая использует half vector (средний вектор между направлением взгляда и направлением к источнику света).

​Blinn-Phong model Alan Zucconi

Мы условимся, что в нашей стилизованной модели, блик всегда абсолютно белый.

Чтобы использовать модель Blinn-Phong, нам надо знать направление взгляда. Unity предоставляет нам эту информацию, но чтобы получить к ней доступ, добавим соответствующую семантику.

struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 worldNormal : NORMAL; half4 color : COLOR; float3 viewDir : TEXCOORD1; // Добавляем эту строку }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.worldNormal = UnityObjectToWorldNormal(v.normal); o.color = v.color; o.viewDir = WorldSpaceViewDir(v.vertex); // Добавляем эту строку return o; }

Для начала реализуем блик фиксированного размера.

static const half4 SPECULAR_COLOR = half4(1, 1, 1, 1); fixed4 frag (v2f i) : SV_Target { float3 normal = normalize(i.worldNormal); float NdotL = dot(_WorldSpaceLightPos0, normal); float NdotL01 = NdotL * 0.5 + 0.5; half shadowMask = 1 – step(1 – i.color.r, NdotL01); // Рассчитываем блик float3 viewDir = normalize(i.viewDir); // Считаем half vector float3 halfVector = normalize(_WorldSpaceLightPos0 + viewDir); // Ограничиваем значение NdotH между 0 и 1 float NdotH = saturate(dot(halfVector, normal)); // Рассчитываем фиксированный размер блика float specularIntensity = pow(NdotH, 50); // Создаём маску блика half specularMask = step(0.5, specularIntensity); // Умножаем маску блика на инвертированную маску тени, // чтобы блик не появлялся в затенённой области specularMask *= (1 – shadowMask); fixed4 texCol = tex2D(_MainTex, i.uv); half4 shadowCol = texCol * shadowMask * _ShadowTint; half4 col = lerp(texCol, shadowCol, shadowMask); // Добавляем блик к финальному цвету пикселя по маске col = lerp(col, SPECULAR_COLOR, specularMask); return col; }

Результат.

На персонаже появились блики, но теперь он выглядит немного «пластиковым».Такой эффект создаётся, потому что в реальном мире различные материалы имеют различный блик (или вообще не имеют).

В стандартном пайплайне наличие, размер, цвет и интенсивность блика контролируется текстурами Specular Map и Glossiness Map. Но, опять же, что если мы не хотим добавлять дополнительные текстуры? Мы условились, что блик всегда белый, значит отпадает потребность котролировать цвет и интенсивность. Осталось только разобраться с наличием и размером. Для этого нам снова поможет vertex color, в частности, зелёный канал.

Будут действовать следующие правила:

  • если зелёный канал = 0, блик полностью отсутствует;
  • значение от 0 до 1 контролирует размер блика.

Давайте реализуем это в нашем шейдере. Для этого обновим всего одну строку, в которой мы считаем specularIntensity.

float specularIntensity = i.color.g == 0 ? 0 : pow(NdotH, i.color.g * 500);

На моей модели не так много металлических деталей или других элементов, которым подошёл бы стилизованный блик, по этому я оставил его только на волосах и на пряжке ремня.

Исправляем затенение на внутренней стороне

В начале статьи мы сделали так, что можно видеть тыльную сторону меша. Но если присмотреться, внешняя и внутренняя сторона освещаются и затеняются одинаково. Если свет падает с внешней стороны, внутренняя сторона тоже будет освещена. Давайте исправим это, используя строенную переменную VFACE.

fixed4 frag (v2f i, half facing : VFACE) : SV_Target // Добавляем VFACE { float3 normal = normalize(i.worldNormal); // Разворачиваем нормаль внутрь, если // нормаль направлена от камеры half sign = facing > 0.5 ? 1.0 : -1.0; normal *= sign;

Результат.

Слева — без использования VFACE (внутренняя сторона некорректно освещена), справа — после добавления VFACE (корректное затенение на внутренней стороне, которая не повернута к источнику света)​

Контролируем толщину контура с помощью Vertex Color

Если у Вашей модели есть тонкие элементы и добавление контура ухудшает их силуэт или детализацию, мы можем сделать контур в этих местах тоньше, используя синий канал vertex color.

Добавим следующий код во второй Pass, в котором мы рисуем контур:

struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; half4 color : COLOR; // Добавляем эту строку };

А в функции vert измените одну строку, в которой мы считаем offset.

// Добавляем красный канал как множитель float2 offset = normalize(clipNormal.xy) * _OutlineWidth * clipPosition.w * v.color.b;

Теперь можно контролировать толщину контура, изменяя значение синего канала на вершинах меша.

​Например, тут для демонстрации я сделал, что в районе запястья контур отсутствует, а на кисти и пальцах он в два раза тоньше, чем у всей остальной модели

Корректируем нормали на лице

Лицо зачастую является проблематичным местом. Если модель низкополигональная и не использует текстуру нормалей (как в нашем случае), при затенении могут возникнуть неприятные артефакты. Чаще всего это происходит в районе глазниц, носа и на щеках.

​Можно увидеть то повяляющиеся, то пропадающие тени под бровями и на щеке

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

Для свой модели я сделал следующее:

  • все нормали на лбу, переносице, кончике носа, носогубной складке и подбородке «смотрят» ровно вперёд;
  • нормали на бровях, щеках и скулах развёрнуты, примерно, на 30 градусов в стороны и параллельны друг другу;
  • нормали на висках и по бокам челюсти развёрнуты на 80 градусов;
  • после этого я немного сгладил нормали, чтобы убрать жёсткие переходы.

Слева — до коррекции, справа — после. Выглядит немного криповато, но что поделать…​

Вот так теперь выглядит затенение лица в динамике.

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

Отбрасываем тень

Если вы обратили внимани, в движке наша модель не отбрасывает тень и не попадает в тень от других объектов (включая тень, отбрасываему самим собой на себя).

Отрасывание тени реализуется добавлением уже готового Pass. Добавьте эту строку после того как закрыли фигурную скубку второго Pass.

UsePass “Legacy Shaders/VertexLit/SHADOWCASTER” ​Теперь наш персонаж отбрасывает тень

В данном случае self shadow и тени от других объектов скорее добавят больше визуальных артефактов, по этому их реализовывать не будем. Если вам все таких хочется добавить «получение» теней от других объектов, то в той же статье Roystan’a описано, как это можно сделать.

Вот мы и закончили написание своего стилизованного цел-шейдера.

Источники

  • https://ru.wikipedia.org/wiki/%D0%A8%D1%8D%D0%B9%D0%B4%D0%B8%D0%BD%D0%B3
  • https://dtf.ru/gamedev/92512-cel-shading-nekotorye-priemy-o-kotoryh-vy-mogli-ne-znat
  • https://makeuponlincourse.com/pravda-o-konturinge-skulpturirovanie-strobinge-shejdinge-i-bejkinge-dlya-obychnyx-zhenshhin/
  • https://tvkinoradio.ru/article/article4991-kak-sdelat-teksturing-i-shejding-dlya-3d-modeli
  • https://www.profguide.io/professions/shading_artist.html
  • https://zen.yandex.ru/media/crazytattoo/tatuirovki-s-vipsheidingom-chto-eto-za-zver-5d1e4f6ed33d2500ad8641a8
[свернуть]
Оцените статью
Понравилась статья?
Комментарии (0)
Комментариев нет, будьте первым кто его оставит

Комментарии закрыты.