Волшебство шейдеров: Почему бутылки в Half-Life: Alyx выглядят так здорово
Для многих из нас в прошлом году нашлось куда больше времени на любимые хобби. Кто-то сделал свою жизнь более насыщенной путем просмотра сериалов или зависанием в играх, а вот программист Мэттью Уайлд посвятил время самоизоляции более грандиозному проекту — созданию шейдера для бутылок с алкоголем в Half-Life: Alyx.
Шейдеры были добавлены в игру еще в майском патче, и буквально сразу обрели популярность среди геймеров и разработчиков. Объяснить это легко — они выглядят действительно круто. Шейдер делает бутылки прозрачными и добавляет в них жидкость, которая реагирует на любые движения естественным образом.
Портал Polygon решил разобраться в принципе работы шейдера, и пообщался с Уайлдом. Мы перевели этот материал. Оригинал по ссылке выше.
Spent a good chunk of lock-down doing this important work. Boozy liquid shader, now available in the latest update for Half-Life: Alyx pic.twitter.com/Iw9h98pmEg
— Matthew Wilde (@skilful) May 28, 2020
Уайлд — разработчик визуальных эффектов, входящий в рабочий штат Valve. Но пока шла разработка Alyx, Мэттью был занят Dota Underlords. Он создал шейдер бокала с вином для персонажа Dota Джула. Это в свою очередь привлекло внимание Скотта Далтона из команды Half-Life: Alyx. Среди локаций Alyx есть огромное множество бутылок, а события одного-конкретного уровня разворачиваются на винокурне и требуют частого взаимодействия с бутылками.
Создание шейдера, который сделает бутылки с жидкостью более реалистичными, повысило бы общие впечатления от уровня. Да и Уайлду не нужно было начинать с нуля: игра была практически готова, имела детализированные ассеты и мощную систему освещения.
В игре было множество моделей бутылок, которые имели красивые текстуры и выглядели великолепно. Поэтому идея казалась многообещающей.
Но дата релиза Alyx была уже не за горами, поэтому за отведенное время было невозможно создать новый шейдер, который не вызвал бы проблем с производительностью.
Если бы речь шла о какой-то случайной бутылке… вероятно, проблем не возникло. Но в данном случае затрагивался уровень с винокурней, содержащей тысячи предметов реквизита и бутылок.
Шейдер так и не был включен в релизную версию игры. Уайлд был разочарован, но все-таки сумел совладать с эмоциями. Half-Life: Alyx вышла 23 марта 2020 года. В тот же день Джей Инсли, губернатор Вашингтона, издал указ о начале карантина, в результате Valve перестала работать в офисе.
И тут, внезапно, у всех появилось много свободного времени. Локдаун позволил нам сделать то, чем мы не могли заняться раньше.
Создание шейдера
Шейдеры — программы, которые задают внешний вид трехмерных объектов. В данном случае речь идет о пиксельном шейдере, который задает цвет каждому пикселю в зависимости от того, как на него падает свет. Все, что отображается в игре, имеет свой шейдер.
Просто некоторые шейдеры используются гораздо чаще остальных.
В конечном счете, шейдеры связаны со многими видимыми нам деталями. Рендеринг чего-либо в 3D — например, всех бороздок и узлов на древесной коре — требует много времени и расходует производительность. Но шейдер может создать иллюзию коры дерева, брони, кожи или пенящегося пива в бутылке даже в том случае, если объект, к которому он применяется, состоит исключительно из гладких многоугольников.
Попав на домашний карантин, Уайлд вернулся к созданию шейдера. В Alyx уже была система освещения, поэтому для работы шейдера нужно было выяснить, какие значения используются при расчете освещения. Шейдер учитывает такие входные данные, как базовые цвета, текстуры и отражения как для жидкости, так и для самой бутылки, а затем объединяет все это вместе.
И тогда выводится другой цвет. Для каждого пикселя, что и дает общий результат.
Шейдер для Alyx стал результатом одержимого сверханализа. Уайлд буквально сидел в подвале своего дома, собирал разные бутылки и игрался с ними, пытаясь выяснить, как ведет себя жидкость внутри.
Вы видите шейдер, который является результатом всей проделанной работы. Это множество страниц материала, которые попросту не могут возникнуть на пустом месте сформированными. Это то, что должно создаваться медленно, поэтапно… а по ходу дела появляются различные идеи, которые как бы накладываются на предыдущие.
Уайлд наблюдал за реальной бутылкой — пеной, образующейся на пиве, следил за тем, как жидкость улавливает свет — а после настраивал эти входные данные для шейдера так, чтобы его творение соответствовало реальности. Это схоже с созданием картины в стиле пуантилизма — пиксель за пикселем. Примечательно, что процесс никак не связан с моделированием.
[Шейдер] действительно заставлял жидкость вести себя так, как я видел в реальности и задал в настройках. Нет ничего более реалистичного, чем это. Но и нет никакой симуляции — просто наблюдение.
Отсюда и формулировка в примечаниях к патчу Alyx: "Теперь внутри бутылок отображается жидкость, которая реагирует на тряску".
Отражение и преломление
Уже давно для обработки отражений в играх используется кубическая карта. Но несмотря на использование трассировки лучей, в мгновение ока уйти от традиционного подхода не выйдет. Кубическая карта представляет собой развертку шести граней куба. В зависимости от того, куда направлена камера геймера, игра будет получать определенные параметры конкретной грани, чтобы создать отражение. Вот почему в играх не работают зеркала — кубические карты не создают идеальных отражений, да и необходимость в этом отсутствует.
В качестве примера можно вспомнить Marvel's Spider-Man на PS4: отражения в зданиях содержат какие-то элементы, расположенные поблизости, но при этом не являются точной копией. В то же время зачастую разработчикам удается сдержать наше недоверие, поскольку созданные отражения выглядят довольно достоверно.
В этом шейдере используется тот же метод кубической карты не только для создания отражений, но и для иллюзии преломления — свет не только отражается, но еще и проходит через объект.
Бутылки непрозрачны. Но они выглядят таковыми, поскольку Alyx создает кубическую карту для ваших приблизительных координат и проецирует конкретное, заранее созданное изображение на ту сторону бутылки, на которую вы смотрите. Вам показывают искаженный вид пространства, но и это всего лишь хорошо справляющаяся с поставленной задачей иллюзия.
Использование [метода] для бутылок, которые по умолчанию создают искажения, где не все так точно и четко… отличная и вполне реализуемая идея. Полагаю, помогает еще и тот факт, что, когда кто-то смотрит на стекло или жидкость, инстинктивно не понимает, какими эти искажения должны быть в реальности. Человек просто соглашается с тем, что видит, воспринимает это за действительность. Звучит немного странно.
Когда шейдер накладывается на жидкость, то приходится использовать двойные искажения кубической карты. Уайлд комбинирует отражения поверх отражений, чтобы создать впечатление, что есть две поверхности — стеклянная бутылка и жидкость, "расположенная внутри".
Так и создается иллюзия жидкости внутри прозрачной бутылки, которая на деле непрозрачна и пуста.
Фальшивая физика
Но на этом игра с нашим мысленным порогом реализма не заканчивается. В случае с физикой вновь используются иллюзии, и никакой симуляции.
Все это фейк, сплошной обман. Простые наблюдения, настройки и изменения значений до тех пор, пока они не станут приближенными к идеалу. Когда я трясу бутылку, [жидкость] немного покачивается. Поэтому и [шейдер] заставляет ее немного покачиваться, поскольку такие колебания выглядят естественно.
Эти колебания — едва ли не основная причина задержки релиза шейдера. Не было эффективного способа передать информацию в игру. В конце концов, затраты на производительность оказались незначительными, поскольку коллеги Уайлда из Valve поняли, что данные могут храниться в цвете вершин шейдера.
Как сказал Уайлд в электронном письме, цвет вершин — "пережиток более раннего времени, до момента появления реалистичных текстур и освещения".
В данном случае речь шла о цвете, который, по сути, нигде не использовался.
Колебания жидкости, направление гравитации, пена или пузырьки — информация обо всем этом хранится в неиспользуемых RGB-каналах. Когда я сильно трясу бутылкой, начинается перемешивание и плескание жидкости. Образование пузырьков или пены также связано со скоростью взбалтывания. Когда движение прекращается, они постепенно растворяются. Но почти все комплексные вычисления — освещение, отражения и тени — все уже просчитывается для каждого объекта в игре, независимо от того, устраивает ли игрок безумие с бутылками или нет.
Секрет успеха
Несмотря на локдаун и обильное употребление алкоголя в период самоизоляции, Уайлд не был одинок при реализации шейдера и решении проблем с производительностью. Визуальные эффекты Alyx создаются всей командой.
В первую очередь успех связан с тем, что уже с самого начала были доступны отличные ассеты. Когда вы разрабатываете шейдер такого типа… вы подключаетесь к уже функционирующему конвейеру и существующим настройкам освещения. По сути, это попытка использовать то, что уже есть, только как можно лучше.
Встряхнуть бутылку в реальной жизни несложно, но куда проще, чем заставить виртуальную бутылку отреагировать таким же образом. Благодаря времени и долгим наблюдениям, алкоголь в бутылках Half-Life: Alyx выглядит настолько правдоподобно, что сложно поверить, что это иллюзия, а не настоящая симуляция. И насколько бы продвинутыми не были технологии, игры только выигрывают от столь незаурядного креативного мышления.
- Создатель Risk of Rain возглавил разработку нового героя для Deadlock, и влияние совершенно очевидно для фанатов
- Детали о STALKER 2 — детали ИИ, до 40 часов на основную историю, поддержка контентом
- Тюрьма в Half-Life 2 выглядит еще круче благодаря RTX Remix