Материал с динамическим смешиванием 2х слоев (часть 1)

Начинающий
Статус
Оффлайн
Регистрация
13 Дек 2020
Сообщения
13
Реакции[?]
9
Поинты[?]
0
В этом примере я покажу как создать материал, состоящий из двух слоев с динамическим смешиванием. Верхний слой смешивается с основным «по нормали» и автоматически выравнивается по «координатам мира» при вращении объекта. Подходит для таких задач как «мох на камнях» или «снег на камнях».

В примере используется UE 4.26.0 и Quixel Bridge v 202.4.0


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

1. Подготовка. Нам нужны текстуры для материалов. Минимум для «камней» и «снега», но можно еще и «мох». Можете пропустить этот пункт, если у вас они уже есть.

1.1 Идем в
Пожалуйста, авторизуйтесь для просмотра ссылки.
и скачиваем понравившиеся текстуры. Я обратил внимание, что лучше ложатся «однородные» текстуры т.е. где нет ярких повторяющихся объектов (камни, палочки, листочки). Для нашего примера разрешения 2k достаточно. Вот, например, материал для мха:


1.2 Теперь делаем экспорт текстур в UE. Здесь немного сложнее. Для 4.26 плагина еще нет, да нам не нужны мастер-материалы от Quixel Bridge, поэтому экспорт сделаем в ручном режиме.
- в настройках экспорта выбираем вариант «Custom Settings» и указываем подкаталог в своем проекте, куда будем экспортировать (что-то типа … \Content\MyGame\Megascan)


- в настройках экспорта выбираем какие текстуры нам нужны, а это Albedo, Normal, Specular + еще одна упакованная (3 в одной): Roughness, AO, Displacement. Последнюю надо добавить по кнопке “add map” и выбрать как показано на рисунке:

Выполняем экспорт по одноименной кнопке, в UE (он должен быть открыт) подтверждаем импорт файлов.

Здесь я использую именно такой вариант упаковки (R_AO_D) т.к. ранее его использовал, но не уверен, что это оптимальный вариант. Specular и Roughness можно указать просто значением (разница на глаз будет не особо заметна и не тратить на них текстуры), Dismastment в этом примере не нужен, AO вроде как вообще рудимент от которого скоро откажутся. Есть какой-то стандарт по упаковке текстур для UE, что принято упаковывать?

Идем в UE и переименовываем текстуры согласно code style чтобы не путаться. Я приучаю себя пользоваться этим
Пожалуйста, авторизуйтесь для просмотра ссылки.
. Не знаю на сколько оно актуально и имеет ли смысл ему придерживаться... По-моему, советы дельные, что думаете?

Вот, например, у меня текстуры для камней, снега и мха:

Экспортируйте себе также 2-3 ассета камней, можно из Quixel Bridge. От них нужны будут только статик-меши, текстуры не нужны, а материалы мы сделаем.

2. Создаем функции для материала. В материале у нас будет 3 функции: «базовый слой», «слой, который отображается сверху» и «функция смешивания».
2.1 Начнем с базового слоя, функция MF_BaseLayer:



Текстуры переносятся простым перетаскиванием, затем в контекстном меню выбираем «Convert to parameter». Изменять их будем в инстансе. Можно было бы конечно сделать это как входящие параметры функции, но я не стал усложнять, просто сгруппировал параметры по «группам» чтобы не запутаться потом в инстансе.

Все параметры этой функции будут в группе «Base», сортировка в пределах группы указана в Sort Priority. Так для Base_albedo = 10, Base_TintColor = 11, Base_TintBrightness = 12, Base_Normal = 20 и т.п

В материале ничего сложного, и что-то похожее, наверное, уже видели неоднократно:
  • возможность указать тайлинг (самый просто вариант с одной текстурой)
  • основную текстуру можно будет чуть-чуть тинтануть цветом и установить яркость этого оттенка.
  • Specular и Roughness можно брать точный «по текстуре» или упрощенный – просто указав значение. Для Roughness так же можно указать силу.
  • Для нормалей можно изменять интенсивность (в нашем случае крайне будет полезно)
  • Displacement не используется, AO тоже можно отключить по желанию.
Обратите внимание, как «по-канально» достаются упакованные монохромные текстуры Roughness, Ambient Occlusion и Displacement

2.2 Теперь создаем функцию для top-материала (мох, снег), назвал ее MF_TopCoverLayer:

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

Параметров здесь не много, принцип группировки тот же, группа «Top»:


2.3 Третья функция – это функция смешивания слоев т.е. как слой Top «будет ложится» на Base. Здесь возможно несколько вариантов, я покажу два (второй во второй части), первый я назвал MF_TopCoverBlend:


У функции есть один входящий параметр Normal (vector3) и один выходящий параметр, я его переименовал в Alpha.

А вот объяснить, что здесь происходит на русском сложно)). Входящий параметр Normal смешивается по высоте (0,0,1 как раз для координаты Z), причем можно указать интенсивность смешивания. Затем эти вектора перемножаются, результат смещается вверх по Z (избавляемся от отрицательных значений) и всё это выступает для альфы смешивания. Где опять же можно настроить интенсивность смешивания (чем больше будет Top_WorldBlendMax – тем большую плоскость будет покрывать Top-материал на Base). И последним, параметр Top_LayerOpasity который позволяет настроить прозрачность наложения (в диапазоне 0 – 1). Уф…

3. Функции создали, теперь создаем сам материал. Я назвал его M_CoverBlend (по основной функции смешивания), перетащил на него 3 созданные функции и соединил так:

Т.е в материале у нас используется всего одна штатная функция MatLayerBlend_Standart для объединения наших 3х. В Base Material идет MF_BaseLayer, в Top Material – MF_TopCoverLayer, в Alpha – наша сложная функция смешивания MF_TopCoverBlend.

Финт с BreakMaterialAttibutes ->MakeMaterialAttributes нужен только для того чтобы достать Normal из базового материала, т.к она нужна для MF_TopCoverBlend. Можно было бы конечно сделать вторым выходным параметром из MF_BaseLayer, но я не стал заморачиваться.

4. Делаем инстанс от M_CoverBlend для отображения снега на камнях, назвал MI_CoverBlend_SnowOnRocks и настраиваем в нем материалы. У меня получилось так:

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

Параметры сгруппированы в 3 группы «Base», «Top» и «Top_Blend», сортировка для меня удобная, у вас может быть другая.

5. И наконец то, ради чего все это затеивалось. Добавляем на сцену статик-меш наших камней и назначаем ему материалом MI_CoverBlend_SnowOnRocks.
Выполните тонкую настройку. Существенное влияние на то, как ложится снег на камни, оказывают параметры из группы «Top_Blend». Меня устроил такой вариант:

Теперь, как бы я ни крутил на сцена свой меш, снег у меня всегда ложится сверху:

Удобно размешать несколько, масштабировать и поворачивать, снег всегда будет на месте. А если сделать несколько инстансов, слегка изменяя параметры наложения снега, изменить чуть-чуть оттенок материала – будут визуально разные камни, при том что сделаны на базе одного меша.

Еще пример. Инстанс того-же материала: текстура камней та же, снег заменил на мох:


Небольшой поворот с масштабированием, мох остается сверху камней:

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

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

Написание уроков отличный способ зафиксировать полученные знания, ну и «реакции» тоже бы пригодились. Хочу получить доступ к некоторым ассетам, которые здесь распространяются. Не то чтобы очень нужны, в само-образовательных целях были бы полезны)).

Часть 2
 
Последнее редактирование:
Сверху Снизу