3,8K подписчиков

Как работает фломастер в Half-Life: Alyx

16K прочитали

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

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

Успев совершенно заслужено влететь в топ самых высокооцененных игр, новая Half-Life : Alyx имеет в себе кучу занятных, неочевидных и порой незаметных механик, которые всё же имеют право быть замеченными.

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

Хау ит воркс

Несмотря на выше написанные восхвалительные сочетания букв, оная механика не нова и уж точно не инновационна, дальним её родственником можно считать даже рисовалку по мини-карте в Дота 2, однако куда более близким примером является Duke Nukem Forever, где в начале игры солдат предлагает Дюку доработать план уничтожения инопланетного монстра на рисовальной доске :

-2

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

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

Она же, в обоих случаях, находится не на самом объекте, будь то рисовальная доска или стекло, а на дублированной поверх геометрии (здесь плоскость) с прозрачной текстурой снаружи. Откуда такая уверенность?

-4

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

Немножко я ушел вперед, разберем пошагово :

  • На конце фломастера (что рисует) особый по своей задаче коллайдер - при столкновении с предметами определенного тэга, любого идентификатора или слоя (например "Glass"), начинает выполняться функция рисования.
  • В первую очередь ей необходимо уловить точку (а при продолжительном контакте точки) прикосновения и соотнести их с пикселями на UV-развертке ибо как UV знает местоположение каждого пикселя на модели, так и наоборот.
ПыСы: не хочу вводить в заблуждение, однако когда я в бородатые годы баловался подобным в Unity, порядок был как раз таков : отслеживаем коллизию - соотносим к развертке - рисуем как бы на ней - в лейт апдейте применяем новую текстуру к модели.
Даже если количество шагов для программиста сократилось, на низком уровне происходит именно это.
-5
  • Вокруг точки контакта, в определенном заранее указанном радиусе (толщина стержня маркера) всё на безликой текстуре заполняется так же заранее указанным для маркера цветом.
  • Для стирания губкой цвет можно пользовать любой, лишь бы его альфа-канал был прозрачным. Эту настройку так же предусматривает шейдер и в цветовом значении в коде это может быть (0.2f, 0.2f, 0.8f, 0f) или
    (R, G, B, A) соответственно, где самым важным для задачи губки выступает последний - любой цвет, но полностью прозрачный.
    Например слегка прозрачный черный маркер на стекле закрашивает полностью прозрачный черный цвет губки.

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