Градиентная раскладка кирпича / плитки с помощью процедурной карты Tiles

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

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

Для начала хочу показать принцип, по которому будем смешивать текстуры. Делается это с помощью параметра % Holes процедурной карты Tiles.

Создаём обычный материал, в карту диффуза которого помещаем карту Mix, где как раз будут смешиваться наши две текстуры. В качестве карты смешивания добавляем Tiles, обязательно установив в параметрах Horiz. и Vert. Count количество кирпичей в наших текстурах. В моём примере это 30 кирпичей в длину и 80 рядов по высоте.

Сделав это, попробуйте покрутить параметр % Holes и увидите, каким образом происходит смешивание текстур. На картинке ниже показаны примеры при значениях 0% (исходный красный цвет), 20%, 80% и 100% (исходный бежевый цвет).

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

Начнём.

Создаём новый материал, и в его карту диффуза помещаем Gradient Ramp. Убираем промежуточные флаги, оставив только начальный и конечный, переключаем тип градиента на Linear, а тип интерполяции на Solid. Затем необходимо разбить шкалу градиента на несколько отрезков. Чем больше отрезков у вас будет, тем плавнее можно настроить градиент, но и тем сложнее у вас получится материал. В этом уроке я рассмотрю вариант градиента из семи промежуточных уровней, на мой взгляд, этого достаточно для большинства задач.

Сразу замечу, что нужно разделять каналы маппинга градиента и смешиваемых текстур. Лучше для градиента использовать первый канал маппинга, а для текстур и тайлов второй. Это позволит использовать градиент на объектах, маппинг на которых генерится автоматом при создании или наложении каких-либо модификаторов (например, Sweep).

Для удобства сразу вытащим в матэдитор семь парных карт Tiles и Mix. Исходные текстуры присоединим соответственно к первому и последнему флагам Gradient Ramp, это будут начальная и конечная точки градиента. Как видно, эти текстуры я использую не напрямую, а через ещё одну карту Tiles, которой при желании можно задать некоторое разнообразие текстуры кирпича с помощью Color и Fade Variance. Но это не обязательно, можно исключить две левых карты Tiles, и просто использовать везде исходные текстуры.

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

Затем присоединяем эти карты Mix последовательно к флагам карты Gradient Ramp.

Обратите внимание, что второй флаг пропускаем. Это последний флаг на шкале (выделен зелёным на скрине ниже), и в режиме интерполяции Solid он не используется.

Далее переходим собственно к настройке градиента. Крутя параметр % Holes каждой из семи карт Tiles, пытаемся добиться равномерного градиента.  Результат меняется нелинейно, так что не получится просто выставить значения с равным шагом, нужно именно подбирать. У меня получились такие значения этого параметра в семи картах Tiles (снизу вверх):

3 - 8 - 20 - 30 - 40 - 80 - 99

Также для большего рандома можно каждой карте Tiles задать своё значение Random Seed.

Но самая верхняя карта даже при значении 99 даёт слишком много светлых кирпичей, и поэтому на градиенте всё равно получится явно заметная граница между 99% и 100% (полностью красным кирпичом). Поэтому для самой верхней карты используем то же самое значение, что и для самой нижней, просто поменяв местами две текстуры кирпича в настройках карты Mix.

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

Значения Horiz.Count и Vert.Count всех карт Tiles можно привязать к контроллерам для удобства дальнейшего редактирования. Для этого создаём два контроллера типа Linear Float и привязываем каждый из них поочерёдно к каждой из Tiles, выбирая соответствующий параметр. Теперь, меняя значение в контроллере, можно изменять его сразу во всех связанных с ним картах.

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

Надеюсь, будет полезно. Если что-то непонятно, то спрашивайте, с удовольствием объясню.

По традиции ссылки на предыдущие статьи:

Раз - Два - Три - Четыре - Пять - Шесть - Семь - Восемь - Девять

Комментарии (57)

+2
Ruma2a
Хороший способ!)
0
Jähman'
вот еще вариант: https://i.imgur.com/7ekcsIS.png 
+4
V.Dolgalev
От души, в закладки!
+5
albatr0s
этот метод думаю стоит еще беркон тайлсом с мультитекстурой разнообразить для самих текстур кирпича, чтоб был тру рандомайз, но там с подгонкой маппинга придется повозиться
+3
Spark
Можно, но это уже совсем сложнение материала. Лучше взять хорошие нетаялящиеся исходные текстуры.
А для некоторого разнообразия текстуры можно крутить Fade/Сolor Variance в первых тайлсах, я специально для этого в примере везде подгружал исходные текстуры не напрямую, а через Tiles.
+21
maxyglaz
Прикольно. Представляю глаза строителей, когда им раскладку такую выдашь :)
+1
AlexRicco
Отлично!
+7
Zolty
Вот так ответ на вопрос на форуме)) Молодец автор
0
valek76
Элегантно, однако!
+1
Zava
Я бы еще до кучи на все тайлы добавил инстансом контроллеры Linear Float в Horizontal и Vertical Count, а так же в толщину швов, тогда можно будет при необходимости в одном месте поменять раскладку кирпичей сразу во всех тайлсах...
+1
Spark
Я в работе у себя так и завязываю всё на контроллеры. Но только в сценах, с которыми работаю только я. Если работа идёт в команде, то излишнее усложнение не идёт на пользу.
С контроллерами работать умеют немногие, и поэтому я намеренно не писал об этом в статье, чтобы не усложнять.
+3
TRAFFIC_rus
Не, по-моему, проще построить один раз всю команду и объяснить, что числовые параметры крутить вот здесь и здесь. Страшно представить, что будет, если неподготовленного человека попросят изменить количество рядов или еще хуже - тип раскладки кирпича.. %) Начнет редактировать каждый тайл, собъется, запутается, удалит в сердцах "этот дурацкий материал" и пойдет рисовать его в кореле, например ))

Вот, напомнило, кстати, чего очень не хватает в максовском мат.едиторе - это возможности обвести рамочкой какую-то группу нодов, покрасить фон за ними, добавить какой-то заголовок, комментарий. Вот как в блюпринтах UE4 сделано, идеально же ))
+2
vladimir.drobzhev90
А можно попросить усложнить? Я не работал еще с контроллерами, было бы интересно узнать про них)) статья очень полезная! Спасибо!
+4
Spark
Добавил в статью
0
vladimir.drobzhev90
Ага, вижу, спасибо
+1
rafa
всю жизнь так мозайку делал для бассейнов.5!
+3
CeBeP_2012
И за всю жизнь так и не узнал, что это называется мозаИка, там нет "й" (((
0
UPland
Спасибо большое!
0
sten
супер!!!
+1
c3dm
Шикарно
0
SPoG
скажу спасибо!))
0
Spirif
От души душевно в душу ! 5 звезд, ушло в закладки)
0
ponchik8686
При-го-ди-тся... Благодарю!
+1
m1rka
А можно ещё отдельную статью по контроллерам?)
0
ViTcore
никого не смущает, что этот рандом слишком рандомный и раскладка выглядит некрасиво
0
albatr0s
нет, был запрос на эту тему для вполне конкретной задачи
0
ViTcore
я видел тот топик на форуме, картинка с вопросом от ТС и этот результат далеки друг от друга очень, как минимум в нормальной кладке не будет кластеров по 3-4 слипшихся кирпича одного цвета. Эту рандомизацию еще надо причесывать, но увы, tiles текстура не позволяет так глубоко копать.
0
Spark
Ну если есть прям желание сделать идеальную кладку, то можно в каждой карте Tiles крутить Random Seed до посинения, пока не поймаешь то, что тебе нужно.
0
ViTcore
Тогда уже проще вручную нарисовать
+1
Spark
Вручную ты можешь нарисовать градиент только под конкретные размеры. Заскейлить его уже будет нельзя.
Фишка описанного способа в том, что градиент можно как угодно трасформировать только с помощью маппинга.
0
ViTcore
да, но что толку, если выглядит неправильно
0
Spark
Ну я ж написал, можно добиться нужного результата, покрутив настройки рандомайза тайла
0
ViTcore
пруф
0
albatr0s
вручную не проще и слишком ресурсозатратно по оперативке в случае огромных поверхностей и большого количества зданий, этож какое разрешение текстур должно быть, чтоб здания держали и дальний план и крупный?
0
ViTcore
нет я имел ввиду вручную нарисовать 4-6 паттерна и гонять их градиентом так-же, будучи уверенным что ни на каком из слоев не будут встречаться большие пятна.
0
Spark
Если так, то да, возможно. Но 4 уровня всё же маловато, 6 минимум надо делать.

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

В общем, твой способ безусловно более аккуратный, но гораздо менее универсальный.
+1
.Kin
substince designer один раз сделал текстуру и тайл по увишке под размер кирпича подогнать... дело сложнее, если у тебя пара кварталов с такой песней, а сделать вчера)
0
nguyenvandoan
Thanks for the useful lesson
0
RednasKella
надо еще урок на тему как определенный узор выкладывать разным цветом с учетом градиента, чтобы и картинка читал ась и градиент присутствовал)))
0
.Kin
ну, это всё же не материал, а чисто диффузная карта только... на зпзп пойдёт, но не в интерьер или пп
0
Spark
Ну так в остальные карты не нужен градиент, туда подойдут обычные битмапы для исходных диффузных текстур.

Если уж совсем разного типа материалы смешиваются, то по такому же принципу и в других картах градиент надо делать.
0
.Kin
тут явно два разных материала получатся с разными свойствами шероховатости и отражений. про рельеф и всякие сколы со своей шероховатостью вообще забить можно. потому и говорю что для закраситькучу домиков на ракурс с птички норм тема
0
Qserg86
отличный урок
0
LAVRUH
Добрый день!
Спасибо большое за урок!
Возникла проблема:

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

Что это может быть?(
+1
Spark
Очевидно, что маппинг неправильно наложен.
Макс не умеет во вьюпорте миксовать две карты с разными каналами маппинга. Так что надо настраивать, отдельно включая отображение градиента и отдельно кирпича.
0
LAVRUH
Спасибо большое!! Получилось!
0
Denis_21
Мои поздравления с победой! А урок я заценил еще в топике, спасибо!
0
kilin
точки в градиенте трудно позиционировать так, чтобы кирпичи не резались "пополам" в местах перехода, особенно в тайлах с разным значением рандома. Под разную высоту градиента всегда придется двигать эти точки, чтобы кирпичи не резались. https://ibb.co/T0j2RJb 
0
pet046
Самое трудное совмещать положение текстуры кирпичей и карты tiles, мне не удалось замешать 2 текстуры так, чтобы tiles попадал на раскладку кирпича.
0
V.Dolgalev
Градиент рамп, храни тебя господь) Не давно с помошью него делал осеннюю пожухлость у шаровиднных кустов с нарасатанием вверх+ подмешал на каждый слот мульти мап, и чем выше, тем больше ставил вероятность появления жухлых листиков
0
true_look
а как правильно настроить маппинг, чтобы градиент ложился правильно на объекты? допустим я хочу сделать брусчатку так, чтобы где участок длиннее градиент допустим не тайлился, а продолжался.
0
niraga
Спасибо большое за урок! В конце статьи вы пишете, что плитка растягивается в зависимости от размера объекта. У меня экструдированный сплайн и текстра не растягивается, подскажите, что я могла упустить?
0
Spark
Это работает только с маппингом, который автоматически генерится некоторыми модификаторами. Самый простой вариант - Sweep или Bevel Profile.
Для экструда надо вручную настраивать маппинг для градиента.
0
niraga
А можете подсказать как плиз? хотя бы в каком направлении двигаться? каких настроек это касается?
0
niraga
К слову я пробовала просто масштабировать текстуру, но в настройках Tiles максимальное количество плиток по вертикали и горизонтали 100, а нужно больше
0
Spark
Масштабировать нужно канал маппинга, который относится к градиенту.
Тайлс должен быть на другом канале маппинга и совпадать с количеством элементов в текстуре (количество рядов кирпичей, например)
0
niraga
Спасибо большое, буду пробовать)