Грязь в Spintires MudRunner

Давайте возьмем скриншот игры и деконструируем его.

Как насчет этого?

Начнем с отключения постобработки: SSAO (окружающие тени), FXAA (смягчает края объектов), DOF (размытие переднего плана), Эффект резкости и коррекция цвета:

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

2. Следы от колес (вернемся к ним позже)

3. Частицы грязи.

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

4. Куски грязи

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

5. Оверлеи дорог с эффектом параллакса.

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

Теперь мы остаемся с самой грязью, которая является простым высотным полем (по существу, 2d сеткой):

Посмотрите на его каркас.

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

Теперь давайте более подробно рассмотрим каждый слой …

Карты в игре MudRunner могут быть размером до 1 на 1 км. Они подразделяются на сетку из 16 м х16 м блоков. Каждый блок содержит список растений (деревья, камни и так далее). Данные по базе рельефа, данные грязи , и другие данные. Игра только рисует блоки, которые находятся внутри камеры «frustum». Активны только те блоки, которые находятся рядом с грузовиком, на котором вы движетесь. Игра выполняет только моделирование физики растений, моделирования грязи и моделирования воды для “активных” блоков.

Имитация грязи состоит из обработки физики грязевых машин (выполняется ЦП) и визуализации грязи (выполняемой графическим процессором). По ряду причин (CPU и GPU не синхронизированы на ПК, и для физики не требуется высокий уровень детализации, требуемый для рендеринга), эти две задачи работают с совершенно разными наборами данных. Мы не будем вдаваться в подробности моделирования физики, но, короче говоря, никакой ракетостроении не задействовано, но это не то, что Havok (физический движок в MudRunner) может cделать из коробки.

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

Текстура 1. Размер текстуры для каждого блока 25×25 , используется для рендеринга как базового ландшафта низкого разрешения, так и грязи с высоким разрешением.
R (красный) высота канала (высота). Он распакован в реальную высоту с небольшой математикой.
G (зеленый) канал — коэффициент смешивания грунтовых материалов. В настоящее время каждый блок может смешивать только 2 материала.
B (синий) — коэффициент «оттенок». Оттенок добавляет некоторые цветовые вариации в окружающую среду и иллюстрирует физические свойства («тонированная» рельефность более мягкая).
Канал (альфа) — обозначает участки базовой местности, которые заменяются грязью, это единственный канал, который динамически обновляется, поскольку транспортные средства деформируют рельеф.

Текстура 2. Размер 128×128, выделяется только для блоков с грязью.
R (красный) канал — «высота грязи», относится к высоте базового ландшафта. Он распаковывается в значение с плавающей точкой с простым умножением.
GB (зеленый, синий) — используется для эффекта «смещения грязи» (грязь отходит от колес транспортных средств по мере их перемещения).
A (альфа) канал — «грязевые дорожки», фактор смешивания шейдера ландшафта в шейдере грязи, в сочетании с каналом A текстуры 1, который делает перемещение грязи в местности незаметным.

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

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

Теперь давайте перейдем к более интересному материалу …

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

Колеи отображаются после местности и большей части окружающей среды. Таким образом, к тому времени у нас уже есть нормали экрана и «экранная маска следов от колес» (которая маскирует часть экрана, поверх которой треки не должны отображаться), в дополнение к буферу Z, конечно. Сама сетка представляет собой простую серию трапеций, которые следуют по пути колеса. Но для эффекта параллакса, который придает шинам прочный холодный объемный вид, нам сначала нужно сделать «высоты» колесных дисков:
Высота колеи необходима для эффекта параллакса. Текстуры проецируются на рельеф с использованием Z-буфера. Трудная часть — правильно упорядочить треки (более поздние треки должны охватывать более старые треки). Существует несколько подходов к этому: мы используем только GPU-метод: рендеринг треков со своим собственным z-буфером (так что нет аппаратного z-теста против сцены) и смещение более поздних дорожек к камере в вершинном шейдере. Z-тест против сцены выполняется вручную внутри пиксельного шейдера.

Затем сетка колесных дисков снова нарисована для второго, окончательного, прохода:

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

Декали грязи местности

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

Каждый рельеф грязи декали имеет сетку ориентированной коробки:
очно так же, как и треки колес, после того, как ландшафт и большая часть среды визуализируются (он называется «Color Pass», и он использует MRT — несколько целей рендеринга), у нас есть экранные нормали (используемые для вычисления освещения) и маска экрана рельефа местности (например, маскирует объекты, на которых наклейки не должны отображаться поверх). Color Pass также записывает коэффициент затенения для декалей местности, чтобы они могли быть освещены более естественно. Декали Z-проецируются поверх сцены.

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

Понравилась статья? Поделить с друзьями:
Комментариев: 1
  1. Аноним

    :!: :!: :!: :idea: :lol:

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: