They Are Here: Alien Abduction Horror | Тизер с НЛО в лесу
“They Are Here” - это хоррор от первого лица, про журналиста, ставшего свидетелем похищения инопланетянами на ферме Грейсвуд.
“They Are Here” - это хоррор от первого лица, про журналиста, ставшего свидетелем похищения инопланетянами на ферме Грейсвуд.
Это выживач от первого лица: бой, крафт, исследования и прокачка скиллов. Степень готовности - прототип, но вполне тянет на полноценную игру, где присутствует логически завершенный сюжет.
Целью проекта я ставил реализацию ряда концепций, которые считаю важными и правильными. Прежде всего, это контекстный интерфейс, где любые варианты взаимодействия персонажа с окружающей средой укладываются в две кнопки мыши. Нельзя плодить множество клавиш управления, из за чего для каждой новой игры приходится заново приспосабливаться. Предпочитаю в качестве органа чувств использовать перекрестие прицела, меняющее форму на предмете, предполагающем небоевые активности. К примеру, забрать в инвентарь, открыть дверь или нажать кнопку. По традиции, левая мышь - основное действие, правая - альтернативное. Если объект под курсором далеко, левая - огонь, правая - прицеливание. Насколько навык прицеливания прокачан, настолько сужается угол зрения камеры. Если предмет близко - левой кнопкой лутать, а правой - получить информацию об объекте.
По поводу исследования локаций надо поговорить подробнее. Предлагаю концепт, когда объекты несут в себе важную скрытую информацию, которую можно извлечь при достаточно развитом навыке. Акт исследования может происходить в двух режимах: беглый взгляд или внимательное изучение. При беглом взгляде научный навык не используется, а если игрок нажимет Ctrl, по правой кнопке происходит сравнение научного навыка персонажа с уровнем засекреченности предмета. Если навык достаточно велик - секрет раскрывается.
Прокачка всех свойств и умений происходит в зависимости от игровой активности: к примеру, высота прыжка зависит от общего количества совершенных прыжков. Внутри игры ведется подсчет всех событий, и оно учитывается в прогрессе соответствующих навыков. Для наблюдения за прогрессом в инвентаре есть специальная закладка.
Бой реалтаймовый, что в принципе не хорошо, поскольку сводится к тупому закликиванию врагов. Для решения этой проблемы предложено использовать механику стамины. Запас расходуется на бег или атаку, а регенерация не такая быстрая, как хочется. Стамина иссякла - ни ударить, ни убежать. Получается прямой аналог Action points в пошаговом бою. Каждое оружие имеет свое соотношение силы атаки к расходу стамины, запас и регенерация зависят от уровня прокачки и допинга. Игрок вынужден заранее рассчитывать силы героя и/или кормить его препаратами. Если шкала голода, жажды или сна ушла ниже 50% - регенерация немного замедляется. А если уходит в ноль - замедляется еще сильнее. При этом возникает отрицательный эффект, такой же, как при болезни - перестают действовать положительные эффекты от любых эликсиров. Если шкала уходила в ноль, ее надо вернуть до 100%, иначе отрицательныйэффект останется. Если долго ходить без воды, еды или сна - начинает медленно уходить здоровье. То же самое происходит при болезни. Эффекты от жажды, голода, бессоницы и болезни складываюся, результат может быть летальным.
Если вес инвентаря выше нормы - нельзя бегать и прыгать, стамина расходуется не только на бег, но и на ходьбу. Если выше нормы более, чем в два раза - персонаж не может ходить. Выбросить можно, но дучше положить в любой сундук, ибо выброшенное не сохраняется.
Крафт основан на верстаках и рецептах, по типу Fallout. Простые рецепты делаются "на коленке", продвинутые требуют средневековых верстаков, топовые рецепты делаются на верстаках современных.Также заметную роль играет одежда: кроме брони, есть множество разнообразных шмоток, каждая из которых позволяет немного повысить определенное умение. В ряде случаев, этого "немного" как раз и не хватает, кроме того, эффекты складываются.
Если Богу будет угодно, проект получит всяческое развитие и продолжение, но надо понимать, что воля божия выражается через фидбэк игрового сообщества. А потому я предлагаю всем и каждому скачать актуальный билд и попробовать поиграть, чтобы потом хоть немного отозваться в комментах.
Не пейте сырую воду, не жрите сырое мясо. Также не жрите сырые грибы, не ленитесь варить суп. Как можно быстрее научитесь строить походную палатку: ее можно забирать с собой, но чтоб заново поставить, надо шесть кусков дерева. Сон в палатке работает как прекрасный генератор пищи: жарьте крыс, а палатку ставьте у воды. Тогда все шкалы уперсонажа будут в порядке.
Будьте любезны, не ленитесь, и скачайте актуальный билд:
https://drive.google.com/file/d/1v_5vXX6sHo4ATicBujDfwTkSOitp7pv2/view?usp=sharing
С историей разработки можно ознакомиться здесь
А еще лучше, взять, и подписаться.
Для самых ленивых могу предложить видео на 14 минут, такой таймлапс прохождения игры.
Немного теории.
Итак, мы ведем разработку проекта, а наше окружение выглядит как пилообразный кошмар. В чем дело и как будем исправлять?
Продолжаем серию статей о разработке нашего экспериментального проекта.
Алиасинг - что это такое и почему это происходит.
Алиасинг, или "Лесенки" появляются при растеризации 3D изображения в 2D картинку для вывода на экран. Каждый пиксель в картинке может быть только одного цвета, поэтому видеокарта (GPU) выбирает цвет пикселя, проецируя 3d фигуру на сетку. И, если фигура не проходит через центр пикселя на сетке - то он не окрашивается. Отсюда и появляются “лесенки” - это хорошо видно на примере растеризации треугольника.
Бороться с этим призвано сглаживание, в нашем случае - MSAA (Multisample anti-aliasing). С включенным MSAA, видеокарта (GPU) при растеризации определяет цвет пикселя, уже по нескольким точкам, а не только в центре, собирая средней цвет в конечно отображаемом пикселе, пропорциональный количеству покрытых точек.
Таким образом, для 2x MSAA проверяются две точки, чтобы увидеть, находится ли в них треугольник, а для 4x MSAA - 4 точки соответственно.
Поскольку в “мобильном” VR, на который мы ориентируемся используется тайловый GPU, при растеризации изображение разделяется на множество прямоугольных блоков - тайлов (16х16 пикселей), и процесс растеризации выполняется уже для каждого из этих маленьких тайлов параллельно, MSAA сглаживания незначительно влияет на производительность и должно быть включено ВСЕГДА. Однако это, увы, не решение всех проблем.
Упомянутый выше тайловый GPU помимо плюсов в производительности, имеет и свои минусы в формировании изображения. Снова не будем вдаваться в технические подробности, а рассмотрим на конкретных примерах:
В интерьере нашего интерактивного музея будет писательский стол с лампами:
Подставка этих ламп - отполированный металл, то есть на нем образуются блики. Проблема в том, что при игре в VR - изображение НИКОГДА не бывает статическим - подергивания от сокращений мышц шеи, дрожание головы и прочие биологический факторы создают микродвижения камеры, а значит, у блестящего предмета в месте его блика, из-за таких микродвижения и особенностей тайлового рендера, снова появится пресловутая “лесенка”. В дополнение к этому мобильный MSAA не сглаживает отражения вообще, что усугубляет ситуацию еще больше.
Бликующая тонкая подставка - при таком ракурсе на расстоянии уже 2-3 метров возникает алиасинг.
Решаем этот вопрос следующими способами:
- Стараемся вообще не использовать контрастных небольших предметов по отношению к фону.
- В LODах лодируем не только сам меш, но и материал, убирая блики пока игрок не приблизится к предмету на достаточно близкое расстояние.
- Убирать блики прямо в материале предмета
- Использовать черную магию Unreal Engine - в настройках текстуры карты шероховатости (roughness) к ней можно добавить карту нормали и указать значение Composite Power. Тогда на всех кривых поверхностях, где будет супер гладкая поверхность и блики могут давать алиасинг на карте шероховатости будет добавлен белый цвет сглаживающий этот эффект.
включение и выключение бликов на пружине. Слева окно параметров текстуры
Еще один пример - стол с красивой столешницей из отдельных досок:
Вблизи такая столешница смотрится отлично - отдельные доски и щели между ними создают нужную детализацию. НО, при отдалении - растеризация сильно усложняется, потому что на один пиксель попадает много полигонов-треугольников. Это плохо не только для производительности, но и страдает внешний вид - снова появляются лесенки, которые в сочетании с описанными выше микро подергиваниями изображения просто режут глаза). Выход - снова лоды, на расстоянии от игрока заменять поверхность стола из отдельных досок - на абсолютно плоскую. Издалека это не так заметно, а лесенки пропадают.
Masked materials
На материалах с маской нужно примерять Alpha to coverage (включается в настройках материала). В таком случае по контуру добавляется несколько градиентных слоев (четыре при MSAAx4).
Раньше приходилось не использовать Masked материалы вообще, а обходится только прозрачными материалами и добавлять небольшой градиентный контур на текстуру маски самостоятельно. Теперь всё сделано за нас и сделано отлично!
Итак, алиасинг на окружающей игрока геометрии устранен переходим к алиасингу текстур и материалов.
Текстурный алиасинг, как и геометрический, происходит при растрировании в 2D-сетку пикселей. Если пиксели на текстуре не совпадают с 2D-сеткой, на которую мы растеризуем, выходное изображение после растеризации будет интерполировано примерно так:
На гифке хорошо видно, что линии мерцают переднем плане, а на заднем плане просто шумный беспорядок. Если бы текстура была сложнее, чем просто несколько белых линий - было бы еще хуже. Именно так выглядит текстурный алиасинг.
Multum in Parvo
Бороться с этим беспорядком нам помогает Mip Mapping.
Если текстура занимает небольшую часть изображения на экране, то и разрешение текстуры должно быть таким, чтобы каждый пиксель текстуры был как можно ближе к размеру блока пиксельной сетки растеризации.
Именно это делает Mip Mapping - уменьшает разрешение текстуры при удалении её от игрока.
Цветная кодировка на гифке показывает, как изменяется разрешение текстуры при удалении. Каждый уровень mip уменьшает разрешение текстуры в 2 раза. То есть если белая текстура 256х256 пикселей, то красная 128х128, желтая 64х64 и т.д.
Результат уже гораздо лучше! Но всё же идеального совпадения размера текстуры с размером сетки растеризации не достигнуть – всегда будет небольшое различие. И при растеризации определить какой будет цвет конечного пикселя при смешивании нескольких пикселей текстуры помогает фильтрация.
Применяющиеся методы фильтрации следующие:
Расстояние, на котором срабатывает переключение на следующий mip уровень, то есть разрешение текстуры уменьшается в 2 раза, можно менять. Это может понадобится, если текстура слишком “мыльная” на близком расстоянии. Или слишком “четкая” на дальнем, что приводит к алиасингу.
Посмотрите еще раз на цветную гифку - сетка, имитирующая пол вообще никогда не отображается в полном разрешении, а переходы на следующий mip уровень слишком заметны.
Смена расстояния срабатывания mip levels называется Mip Bias и по умолчанию он равен 0.
Параметр меньше нуля заставит GPU выбрать текстуру с более высоким разрешением на большем расстоянии, а больше нуля приведет к обратному результату. По моему опыту, смещение в -0,7, хорошо помогает детализированным текстурам сохранять четкость на больших расстояниях, без появления алиасинга, но это только примерная цифра – параметр нужно подбирать индивидуально для каждого случая.
В Unreal engine выглядит это так:
Интерфейсы:
Итак, мы решили все визуальные проблемы в нашем окружении. Все линии чистые и плавные, но по какой-то причине все изображения виртуальных интерфейсов – виджетов выглядят по прежнему ужасно! Ну волнуйтесь, будем исправлять!
Основная проблема в том, что при создании 3d виджетов меню, интерактивных подсказок и всякого такого, в мобильном рендере, что к ним не применяется mipmaping, не применяется сглаживания и даже пост процесс не применяется. Поскольку текстура формируется в реальном времени и перезаписывается каждый кадр - создавать ей mip уровни довольно затратное мероприятие. Выглядит всё это примерно вот так:
Происходит здесь ровно то же самое, что и при растеризации текстур.
Методы борьбы же следующие:
1. Подобрать расстояние, с которого игрок будет смотреть на виджет:
Если каждый пиксель виджета будет совпадать с сеткой растеризации, то изображения будет четким:
Такой метод подходит в случае, если мы точно знаем где будет стоять игрок и не разрешаем ему перемещаться в пространстве. Что далеко не всегда возможно.
2. Stereo Layers
Стереослои позволяют отправлять текстуру в VR композитор шлема, а не рендерить её в движке. Что даёт не только преимущество в производительности, но и композитор рендерит текстуру 1:1 - по сравнению с экраном на мобильном устройстве. То есть как раз все пиксели текстуры совпадают с сеткой растеризации! Идеально! Обязательно используйте стереослои.
Минусов же следующие - скудная документация.
При использовании ES3.1 рендера нельзя рассчитать глубину слоя - он будет всегда виден поверх всего остального, что есть на сцене. В Vulcan рендере глубину задать можно, но убирается вся прозрачность. Вообще вся.
Неудобная реализация интерактивных виджетов - нужно придумывать, как оставить взаимодействие с кнопочками, при этом спрятав сам виджет.
С моей точки зрения стереослои - самый хороший способ.
3. Multisampling
Можно написать кастомный шейдер использующий деривативы (ddx, ddy), общая идея в том, что нужно создать блок 2x2 субпикселя, повторив в нем каждый пиксель оригинальной текстуры 4 раза создав таким образом кастомный мультисампллинг и упростив выборку для растеризации.
Такой метод точно будет ухудшать производительность - учитываем при реализации. Результат же всё равно уступает стереослоям.
Give me the TL;DR
Если нет желания читать все буквы сверху, то вот выжимка:
- Включить 4x MSAA, это обязательно!
- На всех материалах с прозрачностью или маской используем Alpha To Coverage. В особых случая руками добавляем градиент по контуру.
- Отключаем блики и отражения на расстоянии от игрока.
Для всех текстур:
- Включаем mipmapsВключаем trilinear filtering
- Для текстур пола и стен включаем anisotropic filtering
- На текстурах предметов повышенной четкости выставляем mipmap bias в значение -0.7
- Используем стереослои для меню и прочих 3d виджетов.
- Регулярно всё смотрим и тестируем непосредственно в VR на устройстве. Preview рендер в движке не даёт полного понимания.
Полезные ссылки:
Видео по RoboRecall
Статья от Oculus (без VPN не откроется)
Блог Бена Голуса (Ben Golus)
Надеюсь такой поверхностный гайд поможет победить технические трудности при разработке. В следующий раз посмотрим, что уже непосредственно сделано, и начнем планировать маркетинг. Stay Tuned и успехов!
Оглавление:
Часть 0 - Поставили задачу разработать приложение с нуля до вывода прибыли.
Часть 1 - Концепт и Диздок. Создаем приложение для знакомства с творчеством Брайона Гайсина (Brion Gysin) и его Dreamachine в VR!
Часть 2.1 - Оптимизация.
Часть 2.2 - Алиасинг и рендеринг
Почта для всякого: artem@bulletheadgames.com
Привет пикабу, мы - небольшая команда разработчиков которая в свободное время делает игру - Dispell The Haze.
Решили поделится с вами процессом её создания, и получить ваши отзывы.
Немного об игре: это Экшен/РПГ от третьего лица, в которой вы выполняете квесты, сражаетесь, исследуем открытый мир в поисках предметов и прокачиваете персонажа. Именно вам предстоит решить судьбу архипелага, на котором вы живёте, сделав выбор: рискнуть всем ради прогресса или сохранить традиционный уклад жизни.
На данный момент игра находится в ранней стадии разработки и вдохновляется такими играми как Gothic и Zelda.
Вот немного геймплея.
Задавайте ваши вопросы, мы обязательно на них ответим в следующих постах.
В этом обновлении:
+Добавил солнечные панели, теперь энергия для разложения веществ будет восполняться.
К примеру можно разложить добытую воду на кислород и водород, и использовать их как топливо и для дыхания.
+ Теперь ресурсы при добычи из астероидов будут постепенно исчезать, что поможет в понимании на какой стадии находится их добыча.
+ Теперь игра использует таблицы данных (DataTables), это очень удобно для хранения данных о различных модулей и их балансе , раньше я использовал отдельные классы для этого.
Как пример данные о двигателе.(правда, пока что он один).
+ Провёл тотальный рефакторинг компонентов корабля, теперь каждый элемент представляет собой полноценный модуль, и использует таблицы данных для выбора параметров.
Одна вакансия, два кандидата. Сможете выбрать лучшего? И так пять раз.
Стрим разработчиков по итогам Rollback тестов: Февраль 12 , 21-00 MSK, STEAM.
(The original song by Andrew Gold remixed by The Living Tombstone)