September 20, 2022

Процедурный террейн

Вся суть террейна кроется в его шейдере

Его полное представление на рисунке ниже:

Этот шейдер выстроен полностью на базе реверсивного исследования сложного процедурного материала от Brushify.io с некоторыми моими авторскими модернизациями

Здесь представлено множество различных аспектов, дающих в сумме Next-Gen результат (далее все будет влиять от текстурных сетапов, которые вы получите и примените к материалу для работы)

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

Однако уже сейчас стоит выделить несколько ключевых аспектов:

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

Никогда все подряд не сваливается в одну кучу...

Отдельные аспекты представлены материальными функциями, где в первую очередь вы должны побеспокоиться о количестве и типах входов (Inputs) и выходов (outputs)

Вот пример одной из таких функций, реализующих тесселяцию и дисплейсмент:

2. Кто работал с шейдерами для лендскейпа знают о слоевой структуре

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

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

И эти аспекты мы видим здесь (BaseNormal, Roughness, Displacement, Slope Albedo и Normal - склоны и т.п. - все что вам нужно)

3. Если вскрыть такую функцию, то именно здесь мы увидим сложение всех слоев, которыми в будущем сможем красить ландшафт:

  • Первый блок - сама поверхность
  • Второй блок - смесь поверхности со склонами

Обратите внимание, что каждый слой и здесь представлен материальной функцией, например: MossyNeedles (мшистые хвойные иголки)

Откроем ее:

Хитрая нода (1) отвечает за тайлинг и оффсеты (сдвиги текстур) в зависимости от дальности камеры наблюдателя (нода 2)

Ноды (6 и 7) - это просто текстурные семплы (текстуры), которые отображаются на дальних планах (можно сказать с высоты птичьего полета), однако по мере приближения в какой-то момент эти текстуры отключаются и вместо них включается текстура (8)

Вот именно ее и можно увидеть в процессе игры - она является доминирующей. Для нее также и реализован тайлинг

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

Управляют всем этим механизмом ноды 1, 2, 3 и 4

Нода 5 - это отдельная функция, которая полностью соответствует всему что представлено на предыдущем рисунке

Но она отвечает за работу карт нормалей:

Ну и нода 9 - это выход для подключения этой функции — слоя в общий механизм шейдера

Кроме того, отдельно стоит отметить функционал работы т.н. Grass Type

Здесь я могу включать или отключать независимо от остального грасс тайпы для каждого слоя:

Благодаря грасс тайпам я уже имею объем на ландшафте еще до внедрения растительности и прочих декалей

Вот так выглядят слои без грасс тайпов:

А вот так с включенными грасс тайпами:

Естественно, если здесь включаются какие-то травинки, то через их материал можно включать и колыхания на ветру, тогда это все становитсяне только объемным, но еще и динамическим

Но это уже вопрос настройки растительности

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

и с ними: