Demo

Морщинистые карты в "Кузнеце

TORBJORN LAEDRE / UNITY TECHNOLOGIESContributor
May 28, 2015|3 Мин
Претендент сминает баннер
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.

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

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

Введите драйвер морщинистых карт

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

Маска для лица претендента в инспекторе

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

Пространство экрана Challenger

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

// Sample occlusion and normals from screen-space buffer when wrinkle maps are active
#ifdef WRINKLE_MAPS
float3 normalOcclusion =
tex2D(_NormalAndOcclusion, IN.screenPos.xy / IN.screenPos.w).rgb;
o.Occlusion = normalOcclusion.r;
#ifdef _NORMALMAP
o.Normal.xy = normalOcclusion.gb * 2.f - 1.f;
o.Normal.z = sqrt(saturate(1.f - dot(o.Normal.xy, o.Normal.xy)));
#endif
#endif

Окончательные результаты

Сравнение базовой головы с преувеличенно сердитым блендшейпом при полном весе иллюстрирует дополнительные детали, добавленные картами морщин:

Challenger без морщин
Морщины Challenger

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

Виды отладки Challenger

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