Питоны похожи на контрольные точки. Они особенно полезны, когда вы начинаете играть в игру.
Глубокое погружение в техническое искусство: Как Cairn рендерит игровые материалы скал с помощью 3D-блендмэпов

Энтони Байер из The Game Bakers погружается в техническое искусство разработки «поверхностей без питонов» для своей симуляции скалолазания, Керн. Узнайте, как они преодолели проблему согласования визуальных эффектов с игровым процессом с использованием 3D-бленд-мэпов и вычислительных шейдеров в Unity.
Привет! Я Энтони Байер, технический арт-директор в The Game Bakers. Я изначально занимался графическим дизайном (веб, печатные издания). Мой первый опыт работы в видеоиграх был связан с мобильными играми в качестве создателя 3D-моделей в 2010 году. Тогда я ничего не знал о программировании, но мне очень нравилось работать с графикой в движке видеоигр, поэтому я начал изучать JavaScript и в свободное время работал над несколькими небольшими проектами в Unity. Теперь я провожу больше времени, пишу код, чем создавая 3D-модели! Вы можете найти некоторые из моих работ на моем Страница ArtStation.
Я начал работать со студией The Game Bakers в самом начале Furiразвитие в 2014 году. После выхода игры Furi в 2016 году мы работали над Haven (запущенной в 2020 году), а в январе 2026 года мы выпустили нашу новую игру Cairn, симулятор скалолазания.
Что такое питон в Cairn?
В Керн{b}Вы можете лазить почти по любой стене, и мы реализовали механику выносливости, чтобы сделать этот опыт более сложным.{u} После некоторого времени подъема Аава (персонаж игрока) в конечном итоге устанет. Чтобы отдохнуть, она может закрепиться на стене с помощью металлических шипов, называемых питонами. (Примечание по игровому процессу: Питоны не обязательны, и вы можете лазить без них, но это требует более глубоких знаний Кернуправление подъемом ).
Чтобы увеличить сложность на некоторых стенах и создать маршруты «фри соло», мы хотели запретить установку питонов в определенных местах в окружающей среде. В этом блоге я объясню, как мы разработали эту небольшую техническую часть игры, которую мы называем Поверхности без питонов.
Керн главный герой Аава отказывается ставить питон на поверхность без питонов.
Как добавить в окружение различные типы поверхностей
Когда вы хотите внести изменения в местность, что первым делом приходит на ум? Вы можете...
- Добавьте новые объекты и геометрию
- Добавьте «рисунок цветом вершин»
- Используйте «текстуру блендмэпа»
Керн — это определенно не ваш типичный "террен, управляемый высотной картой"; на самом деле это сложенная из наборов гора (подробнее об этом в этом посте на ArtStation).

Это затрудняло создание вариаций с помощью дополнительных объектов/геометрии, поскольку это добавляло больше ограничений к уже сложному процессу проектирования уровня (и мы хотели свободно проектировать наши поверхности No-Piton поверх фактического проектирования уровня для скалолазания).
Блендмап и цвет вершин — это похожие методы, оба из которых представляют собой маски, которые используются в шейдере для создания вариантов рендеринга.
В нашем случае мы не могли использовать раскраску цветом вершин, потому что:
- Вершин для покраски было слишком много.
- Было слишком много случаев пересечения геометрии (сетки для держания рук, наложенные на китбашенный ландшафт).
- Наши модульные камни используют LOD, поэтому плотность вершин не постоянна.
2D-блендмэп
В итоге мы решили использовать решение с блендмапами!
К счастью, у нас уже был специальный инструмент, используемый для создания уровней, TexturePainter. Этот инструмент позволял нам рисовать блендмапы в редакторе и назначать их группам рендереров (выбранным вручную или автоматически, если они находятся в пределах TexturePainter).
В The Game Bakers мы любим создавать собственные инструменты в Unity — [ExecuteAlways] обычно первая строка, которую я добавляю в каждый скрипт!
Мы в основном используем TexturePainter для рисования слоев травы и снега на земле, но поскольку мы можем свободно вращать TexturePainter, мы можем рисовать на стенах.

После нескольких небольших настроек шейдеров мы создали наш блендмэп «Поверхности без питонов» и смогли динамически изменять текстурирование/оттенки.
Поскольку это готовая текстура Texture2D, легко взять значение текстуры в заданной мировой точке, чтобы определить, может ли игрок установить питон или нет.
Концепция сработала! Но на этом этапе она была все еще довольно ограничена, потому что это 2D-маска проекции, и у нас могла быть только одна такая маска для всей горы, поэтому точность была низкой.
На этом этапе мы не были уверены, попадут ли «Поверхности без питонов» в игру. Визуально они не выглядели привлекательно, и нам нужно было провести множество тестов игрового процесса и дизайна уровней, чтобы убедиться, что они добавляют значимую ценность в игру.
Но мы могли бы хотя бы начать экспериментировать с тем, как это должно выглядеть.
Открытие некоторых параметров рендеринга позволяет нам попробовать разные потенциальные варианты внешнего вида для этого типа поверхности.
Когда ваше первое решение вообще не работает
Пока мы пытались улучшить рендеринг на стороне художественного направления, на стороне дизайна уровней ограничение «2D-проекции» становилось всё более проблематичным. Из-за особенностей дизайна уровня нам нужно было иметь 3D-контроль следующих поверхностей без питонов:
- Поверхности без питонов, которые можно найти внутри горы (в пещерах)
- Поверхности No-Piton, которые могут обворачиваться вокруг вогнутых/выпуклых стен/архитектуры
…
Пропуск времени
В разработке игр всегда много новых идей и новых задач. Мне нравится работать как бабочке – каждый раз, когда я застреваю на чем-то, я игнорирую проблему и иду делать что-то другое!
…
Через три-шесть месяцев…
Для других новых функций мы используем Texture3D для представления поля расстояний. Мы размещаем множество объемов (коробки и эллипсоиды) и генерируем текстуру поля расстояний из этого, при этом каждый пиксель содержит расстояние до ближайшего объема. Каждый объем может быть аддитивным или субтрактивным.
Это то, что мы называем «Топологическим представлением»: эффект изображения в пространстве экрана, управляемый текстурой Texture3D в мировом пространстве.
Эти текстуры поля расстояния 3D имеют низкое разрешение и генерируются по требованию во время выполнения (они также не запекаются в редакторе и не читаются с стороны CPU).
3D-блендмэп
На этом этапе пришло время испытать наше решение 3D-блендмэпа для поверхностей без питона.
С точки зрения шейдера, переключение с Texture2D на Texture3D не представляет сложности. Теперь все, что осталось сделать, это добавить немного шума к координатам мира, чтобы скрыть эти пиксели с низким разрешением, и, воilà!
Редактирование поверхностей без питона
Это решение работало визуально, но геймплей был сломан, потому что мы не могли определить местоположение игрока на текстуре, потому что текстура не могла быть прочитана процессором.
Отбор по полю расстояния выполнялся на стороне процессора путем итерации по каждому объему примитива (коробки, эллипсоиды). Однако, поскольку мы добавили шум в координаты мира в шейдере скалы, на краях был заметен сдвиг; очевидно, ему не хватало точности.

Синхронизация визуальных эффектов с игровым процессом
Чтобы исправить это, мы использовали шейдер вычислений, чтобы получить те же самые значения, которые видны в шейдере скалы.
Когда игрок хочет установить питон, мы используем лучевую трассировку для нахождения места, где будет установлен питон, и проверяем, находится ли игрок в зоне, где установка питона запрещена. Если это так, мы отправляем запрос в шейдер вычислений в позиции установки питона. Когда результат шейдера вычислений возвращается (в той же кадровой разметке или через один кадр позже), мы проверяем или отключаем возможность установки питона.
Теперь у нас есть пример с точностью до текселя: «шероховатый шейдер» и «шероховатый шейдер без проверки питона», оба из которых используют один и тот же код.
Как оказалось, это решение было немного слишком Точно!
Представьте, что вы находитесь посреди обычной скалы и скалы без питона, и вы хотите установить питон, но вы не можете этого сделать, потому что позиционирование игрового мира определило, что вы находитесь на поверхности без питона. Это кажется очень несправедливым, когда вы можете установить питон всего в двух дюймах от него.
Чтобы исправить это, мы запускаем несколько образцов вокруг игрока в небольшом диапазоне, чтобы найти подходящее место, если таковое имеется.
Здесь вы можете видеть, что проверка зеленой линии происходит на скале без питона, в то время как проверка верхней синей линии происходит на обычной скале; мы выберем второе положение для установки питона.
Всегда есть над чем поработать
Когда все выглядит хорошо, пришло время доработать и отполировать.
Мы реализовали способ загрузки нескольких областей без питонов одновременно. Только ближайшая область является «реальной», в то время как остальные отображаются в виде декалей LOD. Это решение далеко от идеального, потому что деколи откладываются и не могут получать освещение так же, как шейдер скалы, но для наших нужд этого было достаточно.
Переход карты смешивания No-Piton 3D от LOD0 (рендеринг внутри шейдера скалы) к LOD1 (рендеринг с отложенной декой)
Вот и все про поверхности без питонов. Если вы играете в Cairn и находите способ установить питон на поверхность без питонов, пожалуйста, сообщите мне – всегда есть что-то, что можно исправить!
Спасибо за чтение!
Cairn сейчас доступен на PC и PlayStation®5, а бесплатное дополнение «On The Trail» выйдет этим летом. Узнайте больше о играх, созданных в Unity, на нашей странице Steam Curator, и ознакомьтесь с другими историями разработчиков Unity в блоге Unity Blog и в разделе Resource Hub.
