Найти в Дзене
Stronghold of gamedev

Как делают моря в играх

Оглавление

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

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

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

Что есть море

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

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

-2

Как бы странно это не звучало, но любой водоем обычно представлен даже не в виде объемной фигуры специфичной формы, а просто плоскостью. Сами подумайте - плоскость голубого цвета, чем не вода? А если под ней есть отмоделенное дно, то можно даже прозрачной сделать!
Так и правда делали в старых играх, а похожим образом сейчас.

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

-3

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

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

Так, по прикосновению с тем же триггером водной глади, персонаж сменяет тип передвижения на другой, похожий на плавание. Именно похожий, ведь для движка это выглядит как летающий человечек под кучей полигонов, старательно размахивающийся конечностями.

Прекрасный пример в недавно вышедшей Sekiro :

-4

Да, это баг. Игрок вылез из воды сквозь текстуру близ дна и, не триггернув выход из неё, остался плавать по воздуху. Статья про еще пару багов Секиро есть на канале.

Шейдеры и волны

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

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

-5

Он же способен и на другие действа, ведь он по сути диктует объекту правила визуализации, например схожими с рябью методами можно реализовать круги на воде или пенку :

-6

Текстура пенки генерируется там, где вершины взаимодействуют с другими объектами, например берегами суши.
Особо умелые повелители шейдеров спокойно сделают эффект глубины и даже проблесков света :

-7

А что касается волн? Они более объемные и уж точно должны быть видны игроку под кучей углов. Здесь приходит зачастую vertex displacement, что в переводе с эльфийского означает "смешение вершин".

-8

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

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

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

  • Ресурсозатратность. Даже если динамично разбивать геометрию на более детализированною только около волн. Шейдер все еще выгодней.
  • Физики все равно не будет. Ибо обновление геометрии коллайдера, скажем так 60 раз в секунду, немножко безумно, не считаете? Ему еще столкновения обрабатывать. Так что специально для волны придется либо делать какой-то отдельный коллайдер, либо играть по другим правилам, как это сделали NVIDIA с их WaveWorks :
-9

А еще говорят найти хороший контент в дзене так же сложно, как сокровище посреди океана. А вы уже нашли?