разное / 29 февраля 2024, 20:4029.02.2024, 20:40
1714660601

Как создать качественное отражение в зеркале в видео игре?

Как для начинающих разработчиков, так и для опытных специалистов очень важно разбирать устройство игр по отдельным элементам - в этой статье разработчики из студии Skill Rush подробно осветят тему отражения в зеркале внутри 3Д движков. Информация очень полезна и поверьте собрана буквально по крупицам из личного опыта. Подробно рассмотрим, какие бывают отражения, как они реализуются, как сделать отражение в редакторе движка. Для начала вспомним про два движка - Unity и Unreal Engine, последний, конечно, тяжеловесный, но зато обладает большим количеством настроек, что даже придумывать разработчику ничего не нужно.

Для того чтобы максимально разобраться с различиями двух движков, для наглядности их можно сравнить с детскими площадками: Unreal Engine - это довольно продвинутая игровая зона в дорогом жилом комплексе, где для каждого ребенка найдется несколько снарядов на его вкус, под его любимый цвет и форму. Есть желание - выбирай качельку и качайся на ней, хочешь - поиграй в песочнице с мелким песком, хочешь - выбери себе горку по оптимальной для тебя высоте, цвету и направлению. Unity — это такая старая советская площадка, в которой песочница сделана из крупного песка с гранитной крошкой. Горка там из покарябанного металла, уже ржавого и непригодного для использования, а вместо качественных снарядов несколько турников. Удовольствие можно получить сразу на двух площадках если конечно найти правильный для этого подход. В первой можно работать по принципу - сразу зашел и можно играть, ко второй нужно собрать друзей, набить несколько шишек и только потом приступить к самому процессу.

Именно такой принцип работает абсолютно для всего что вы хотите сделать на этих движках. Результат на самом деле будет максимально похожим, но вот затраченные усилия отличаются. Зеркальные отражения — в этом далеко не исключение. Сначала мы хотим разобраться, какие отражения в играх встречаются, ведь проблема с ними стоит довольно остро. Она появилась в играх еще с момента их появления, например в пиксельных 2Д играх было довольно трудно сделать настоящее отражение по вполне понятной причине - пиксели сами по себе не отражают, их было невозможно отполировать. Сейчас подход к пиксельной графике изменился кардинально особенно в крупных движках.

Старинные пиксельные арт игры, в которых каждая точки на экране подконтрольна коду, не является частью отдельного изображения, текстуры - все еще выходят в свет, как пример можно привести оригинальную Dwarf Fortress. Но стоит отметить, что большая часть игр работает еще со старыми спрайт-картинками разного уровня самостоятельности - об этом поговорим как-нибудь попозже. Если по сюжету было необходимо, то отражение в зеркале рисовалось вручную, зачастую такой принцип работы использовался в кат-сценах, постановочных роликах, заставках или в заскриптовых моментах, где у игрока отнимают управление, а технически все остается одно и тоже. Когда выходят первые 3Д игры - все меняется, графика становится намного лучше и актуальным становится вопрос: как сделать качественное отражение?

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

 

Имитация зеркального отражения

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

Текстуры отражения - блеск. Когда у разработчиков появилась возможность использовать две или более текстуры на одном участке модели, то сразу стали применять бампмапы, то есть текстуру рельефа. Позже они полностью были вытеснены нормалмапами, картами нормалей, которые имитируют объем за счет искажения падающего на модель света. Это относится больше всего к отрисовыванию правильных теней и бликов, но при этом очень сильно влияет на блеск. Исключением стал проект normal map в TES V: Skyrim, в котором объединены карты нормалей и карты блеска. Сине-розовая часть канала цвета регулирует сам рельеф, а альфа-канал силу и определенное место блеска. После нормалей изобретают текстуру блеска, она зачастую является бело-черного цвета, в которой черный оттенок отвечает на отсутствие блеска, а абсолютно белый за максимальный блеск. Иногда такие текстуры взаимодействуют с активным альфа-каналом, но не все движки могли отразить адекватно переходы цвета. До сих пор средства визуализации плохо воспринимают белый цвет в системе RGB, поэтому специалисты по текстурам стараются его использовать крайне редко.

С течением времени модельки становились все лучше, как и средства отображения, но пользователи все равно хотели увидеть что-то большее. Обычные, давно используемые текстуры блеска не закрывали потребность в стремлении увидеть что-то более красивое: для кожи, волос, шерсти все еще подходили спекуляры вместе с нормалмапами, но отрисовать такое не стекле или металле уже не получалось — это не работало. Отрисовать честные отражения в реальном времени не было возможности. В этот момент в дело вступала фантазия, которая говорила - зачем нам иметь честное отражение в игре, ведь 98% всего игрового времени пользователь не видит столь близко отражающую поверхность. Можно ведь сделать несколько гуляющих бликов и на этом все, причем желательно постоянно не обращаться к настройкам модели. Тогда на помощь разработчикам пришли первые сферические карты или кубические. Несмотря на то что у них есть разница в названии, принцип работы примерно одинаковый: есть среда, в которой расположена модель, будь то участок или помещение, в ней нужно определить какие могут быть источники света и выставить основные цветовые акценты - после этого остается выбрать из двух основных вариантов: сложного и простого.

Простой вариант подразумевает под собой рисование примерной карты бликов вручную с приближением к бесшовной технике tiled map. Такой способ может найти себя в работе с небольшими картами, созданными для блеска, не очень отполированными и без 100% отражения. Сложный вариант подразумевает создание сцены окружения в 3Д формате движка при помощи добавления в него камеры-зонда и снятие панорамного рендера этой камеры. В итоге мы получаем что-то типо HDR-карты, при желании ее можно натянуть на сферу и превратить в скайдом или лайтдом - с куполами фона или освещения в сцене. Рендер создается на этапе разработки, чаще всего ближе к концу в специальном редакторе на базе движка или при помощи стороннего программного обеспечения. Рендер переделывает текстуру и накладывает как обычный кубмап. Большой плюс состоит в том, что отражение окружения получается весьма достоверным для того помещения, где был сделан рендер. Минус состоит в том, что для каждой сцены, для каждого помещения, каждого предмета нужно делать новую пробу света — это достаточно трудозатратно.

Современный и оригинальный способ создания отражения встретился нам довольно недавно в проекте Resident Evil в поместье, которое там находится. Если вы играли в этот проект, то не можете не вспомнить шикарный холл с лестницей, которая идеально отполирована и стоит на зеркальном полу. Получилось очень эффектно, многие пользователи получили массу эмоций. Позже я узнал очень впечатляющий факт, что данное отражение является точной копией оригинального зала. Речь здесь идет не про картину — это была буквально отраженная по вертикали модель зала. Все персонажи, которые заходили в эту модель, дублировались, а их анимация отражалась. Пол был полупрозрачным настолько, чтобы имитировать эффект качественного отполированного мрамора. Как потом мы выяснили такой эффект использовался не только в этом зале, но и вообще по всей игре.

 

Создание честных отражений

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

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

 

Скайдом и панорама

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

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

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

Реклама. ИП Брагин О.С. (2Vtzqwaqj2r)
рекомендуем
 
17:09
16:57
15:29
14:00
13:04
13:01
12:39
12:31
11:38
11:24
01/05
01/05
30/04
30/04
30/04
30/04
30/04
29/04
29/04
29/04
28/04
28/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
27/04
26/04
26/04
26/04
26/04
26/04