sbox — Обновление 22.09.2026
🏆 Новые 250 игр в Game Jam III, скриптинг от Гарри - новый путь моддинга, улучшения для Party системы, теперь можно перетаскивать ассеты без потери ссылок, уменьшение веса шейдеров на 91%
Оригинал (ссылка)
Геймджем
Прошло 19 дней с начала Game Jam, и мы получили более 200 работ . Думаю, мы все поражены качеством некоторых из них… и совершенно очевидно, что нам следовало провести Game Jam еще полгода назад. Мы определенно сделаем это регулярным мероприятием с этого момента.
Это первый запуск системы номинаций и голосования, поэтому мы решаем проблемы в фоновом режиме и исправляем их по ходу дела. Всегда будут возникать мелкие неполадки, и мы реагируем на них максимально оперативно.
Приём номинаций завершится в это воскресенье, и игры, набравшие наибольшее количество голосов, перейдут в фазу голосования. После этого каждый день будет происходить отбор. Сообщество будет голосовать за каждую игру, и та, которая наберет наименьшее количество голосов, будет исключена. Голоса будут обнулены, и мы проголосуем за оставшуюся группу игр. Пока не определится победитель.
Возможно, это будет полный провал, но я с нетерпением жду, как всё пройдёт.
Главное меню
На этой неделе внесены некоторые небольшие улучшения в меню. Награды теперь открываются во всплывающем окне, а не на целой странице, предварительный просмотр игр стал быстрее, и мы исправили проблему с тем, что меню было слишком маленьким при высоком разрешении (1440p+), а также внесли небольшие улучшения в стиль большинства страниц.
Мы исправили ещё одну проблему с экраном загрузки, из-за которой одновременно отображались два экрана загрузки.
Система Party
Теперь мы поддерживаем группы до 16 человек, вместо 8. Мы также улучшили видимость, поэтому теперь гораздо понятнее, когда лидер вашей группы присоединяется к игре.
Вы можете отменить присоединение, не покидая группу, или повторить попытку, если что-то пойдет не так. Мы также исправили проблемы со слежкой за лидером между играми, дублирующимися приглашениями и очисткой соединения Steam, а также сделали сообщения об ошибках при сбое соединения более понятными.
GUID Ресурсов
Мы обеспечиваем ресурсам стабильную идентификацию, чтобы вы могли свободно перемещать или переименовывать файлы, не нарушая ссылки .
Теперь каждый ресурс будет иметь GUID, хранящийся рядом с ним в .metaфайле, и любые ссылки на этот ресурс будут хранить этот ID вместе с путем. При загрузке мы сначала попытаемся определить ресурс по этому ID, а при необходимости вернемся к последнему известному пути.
Важно включить эти .metas-файлы в вашу систему контроля версий. В противном случае у всех пользователей вашего репозитория будут разные ID для одного и того же ресурса, а это вам не нужно.
Это первая часть работы, охватывающая основную инфраструктуру и ссылки на типы GameResource, включая большую часть системы сцен и префабов. Ссылки на форматы Valve (например, материалы, используемые внутри модели) еще предстоит добавить.
Мы будем расширять поддержку, пока все не будет использовать эту новую систему, но пока будьте внимательны и, вероятно, не стоит пока что полностью перестраивать весь свой проект. Мы к этому еще вернемся.
Вкратце: теперь у ресурсов есть постоянные идентификаторы, поэтому перемещение или переименование файлов не нарушит работу систем, указывающих на них. Просто убедитесь, что .metaфайлы перемещаются вместе с ресурсами и помещаются в систему контроля версий.
Скриптинг 0.1
Я добавил систему скриптов. Это что-то вроде версии Lua для AC#. Это экспериментальная версия, и я буду её дорабатывать. Это не окончательная версия, но можете смело с ней поэкспериментировать. В комплекте идёт ScriptControl с подсветкой синтаксиса для редактирования скриптов... это панельный элемент управления, поэтому его можно использовать в игре.
Идея заключается в добавлении чего-то, что сможет выполняться непосредственно в скриптах. Это станет частью Doo и упростит переход от ActionGraph для многих пользователей. Я также хочу интегрировать это в редактор материалов, чтобы это позволило использовать динамические выражения для свойств.
Вкратце: Скриптинг уже здесь. Вы пишете во встроенном редакторе кода, и изменения вводятся в режиме реального времени по мере ввода, поэтому вы получаете мгновенную обратную связь вместо пересборки всего проекта. Это также текстовая альтернатива визуальным графам узлов (ActionGraph), которые использовались ранее.
Panel Docking
В систему Panel теперь встроена система стыковки... если она вам нужна. Вы можете использовать её в своих играх. Вы можете делать обычные вещи: изменять размер панелей, перетаскивать их из одного раздела в другой. Работает так же, как и любая другая система стыковки, созданная за последние 10 лет.
Мы будем использовать это, когда редактор перейдёт с Qt на Panels.
Редактор кривых
Новая панель CurveEditorпозволяет редактировать кривые, как и в редакторе. Хотя, это не совсем правда. Она лучше, чем в редакторе.
Обработка окон в C#
Мы перенесли управление окнами игр и панелей в C#. Создание, изменение размера и отображение окон теперь осуществляется совместно с управляемым PanelWindowкодом, при этом маршрутизация событий SDL, курсоры и соединения с контроллерами также обрабатываются там.
Клавишные привязки, настройка консоли и выполнение скриптов конфигурации переместились вместе с ними. Это позволяет интегрировать большую часть кода прикладного уровня в ту же кодовую базу, что и работа с панельным редактором, и значительно сократить количество дублирующегося кода для нативных окон и ввода.
Вкратце: обработка окон и ввода вынесена из старого нативного кода, что позволило избавиться от большого количества дублирующегося кода и сосредоточить большую часть движка в одном месте.
Управление камерой
Теперь вы можете управлять камерой прямо из окна сцены. Выберите камеру и нажмите «Управлять» в окне предварительного просмотра, чтобы перемещать её с помощью обычных элементов управления видоискателя. В окне отображаются настройки камеры, соотношение сторон 16:9 и направляющие по правилу третей, которые помогут выровнять кадр.
Это особенно полезно для записи движений камеры в Movie Maker. Нажмите Alt+F8, чтобы начать или остановить запись во время полета, затем используйте инструмент «Сглаживание», чтобы сгладить любые резкие движения. Нажмите Escape, когда закончите пилотирование.
Исправления записи демок
Запись демоверсии в игре (с помощью movieкоманды) теперь более точно захватывает сцену. Мы добавили поддержку компонентов, связанных с туманом и скайбоксом, а также исправили различные ошибки с моделями для вида от первого лица.
Улучшен также экспорт видео после завершения редактирования демоверсий в Movie Maker. Кодировщик теперь никогда не должен пропускать кадры, обеспечивая идеально плавное движение.
Спрайты в Painter
Теперь Painter может рисовать анимированные спрайты. Новый SpriteInstanceмеханизм отслеживает воспроизведение независимо от самого спрайтового ресурса. Это позволяет рисовать спрайты на панелях и на HUD без необходимости каких-либо специальных действий.
Быстрая установка моделей и материалов
При создании модели из контекстного меню в браузере ресурсов вы можете использовать Try generating materialsфункцию автоматической настройки материалов для вашей модели.
Редактор просканирует папку с моделью (и ее подпапки) на наличие соответствующих наборов текстур, создаст новый материал на основе выбранного шейдера и поместит все найденные текстуры в соответствующие слоты.
Ваши текстуры в наборе должны соответствовать определенному шаблону.
- Имя файла должно заканчиваться суффиксом, например
_color, ,_normal,_roughи т. д. Эти суффиксы должны соответствовать ожиданиям шейдера, это можно проверить в редакторе материалов. - Текстуры должны начинаться с имени, совпадающего с именем слота материала в модели. Таким образом, если вы назначили слот материала для вашей модели в Blender с именем
my_cool_material, то набор текстур для этого слота также должен начинаться с этого имени. Например,my_cool_material_color.
Это должно работать со всеми шейдерами, включая пользовательские, при условии, что ваш шейдер правильно указывает ожидаемое имя суффикса внутри входных слотов текстуры. ( См. документацию по атрибутам шейдера ).
Эта функция не заменяет ничего, это просто альтернативный рабочий процесс, который можно использовать для быстрой настройки модели и материала.
Больше UV каналов
Теперь пользовательские шейдеры могут получать доступ к третьему и четвертому UV-каналам модели через семантику LowPrecisionUv2вершинного LowPrecisionUv3ввода.
Они недоступны в вашем шейдере по умолчанию, вам необходимо сначала добавить их в структуру VertexInput в шейдере. Вот как можно добавить UV2/UV3 поверх стандартного вершинного ввода:
ПРОТИВ
{
// Добавление полей для каналов UV2/UV3 поверх стандартного ввода вершин
# include "common/vertexinput.hlsl"
float2 vTexCoord3 : TEXCOORD4 < Semantic ( LowPrecisionUv2 ); >;
float2 vTexCoord4 : TEXCOORD5 < Semantic ( LowPrecisionUv3 ); >;
}Также есть страница документации, описывающая всю семантику ввода вершин (и дополнительную информацию о том, что они, собственно, делают).
Шейдеры
Я значительно уменьшил размер и время компиляции шейдеров, внедрив константы специализации Vulkan и пометив ими различные статические комбинации (варианты шейдеров). Это позволяет нам исключить повторяющуюся работу и код вариантов шейдеров из процесса компиляции, при этом количество конвейеров во время выполнения останется прежним.
Применительно к complex количество задач компиляции PS сокращается с 5728 до 856, skin — с 512 до 128.
Это означает существенное сокращение работы по компиляции шейдеров — с 6 минут до 1 минуты.
Это очень далеко от тех времен, когда компиляция complex.shader занимала 20 часов.
Помимо сокращения количества комбинаций, скомпилированные шейдеры теперь хранят общие модули один раз для каждой программы шейдера, вместо повторения одного и того же байт-кода в разных комбинациях. Модули и данные отражения сжимаются вместе в группы, и каждая комбинация сохраняет ссылку на используемый ею код.
В совокупности все это позволяет нам значительно уменьшить размер поставляемых шейдеров — со 129,88 МБ до 10,80 МБ.
Вкратце: функции шейдеров, изменяющие только поведение (а не входные данные), теперь могут использовать общий скомпилированный код, вместо того чтобы для каждой комбинации требовалась отдельная сборка. Это сокращает количество задач компиляции сложного шейдера с 5728 до 856, что значительно уменьшает время компиляции.
Артефакты рендеринга
Исправлены блочные, пятнистые артефакты, которые наблюдались у некоторых пользователей вокруг датчиков окружения, теней и других объектов, особенно на видеокартах AMD RX 6000-й серии. Графический процессор обрабатывал индекс текстуры как унифицированный, хотя разные пиксели могли запрашивать разные текстуры.
Технология Bindless позволяет шейдеру выбирать текстуру по её индексу в большом массиве. Графические процессоры выполняют вызовы шейдеров группами, называемыми волнами. Если этот индекс меняется в пределах волны, поиск необходимо пометить NonUniformResourceIndex. Если эта аннотация отсутствует, графический процессор может выбрать неправильную текстуру. На вашей машине это может выглядеть нормально, а на чужой — превратиться в описанную выше неразбериху.
Теперь наш API без привязки автоматически применяет эти аннотации на каждом этапе шейдера.
Texture2D texture = Bindless :: GetTexture2D (textureIndex);
По умолчанию приоритет отдается безопасности. Но если вы действительно уверены, что индекс одинаков на протяжении всей волны, вы можете выбрать ускоренный путь с равномерным распределением. Это ни в коем случае не гарантирует ускорения.
cbuffer DrawConstants
{
uint g_nTextureIndex;
};
// Этот индекс используется совместно при отрисовке, поэтому используйте путь к униформе.
Texture2D texture = Bindless : :GetTexture2D ( UniformIndex ( g_nTextureIndex ) );Terrain Material Sampling
Долгое время почти весь код сэмплирования рельефа был застрян в стандартном шейдере рельефа. Теперь он вынесен в остальную часть нашего API для работы с рельефом, и вы можете использовать его практически в любом шейдере, а не только в шейдере для рельефа.
Чтобы использовать его в своем шейдере, добавьте его terrain/TerrainCommon.hlslв раздел пиксельных шейдеров (PS) и просто используйте Terrain::Sample( float3 WorldPosition, bool bUseGeometricNormals ). Он вернет структуру Material, содержащую смешанный материал рельефа со всеми текстурами — альбедо, шероховатость, нормали, окружающее затенение и т. д.
Второй аргумент определяет, следует ли копировать запеченные нормали геометрии рельефа или нет — по умолчанию он равен false. Эта функция выведет рельеф, визуально идентичный тому, что вы видите на самой сетке рельефа, полностью отражая все настройки рельефа и материала. Именно это теперь использует и основной шейдер рельефа!
Я также написал довольно большую страницу документации, охватывающую большую часть нашего бэкэнда для работы с рельефом — вероятно, стоит предупредить, что это не окончательный API, и многое может измениться, но этого должно быть достаточно, если вы хотите писать собственные шейдеры рельефа или делать что-то более сложное.
Исправления экспорта
На этой неделе были внесены некоторые улучшения в автономный режим. Мы исправили проблему с запуском экспортированных игр с пользовательскими значками. Также мы внедрили файл проекта s&box и другие метаданные в исполняемый файл (.exe), чтобы упорядочить папку assets.
Теперь экспорт включает скомпилированные игровые сборки без сопутствующих архивов исходного кода CLL или XML-документации.
Автономные игровые данные также используют корневой каталог данных напрямую, избегая создания дополнительной подпапки для каждой игры. Спасибо boxrocket6803 за исправление папки с данными.
Улучшения теней
На этой неделе сообщество внесло несколько отличных исправлений в работу с тенями, касающихся как внешнего вида направленных теней, так и некоторых отвлекающих ошибок рендеринга.
Мягкие тени, которые действительно остаются мягкими.
Параметр «Жесткость теней» мог перестать влиять на ситуацию при дальних направленных тенях. Даже при нулевой жесткости результат мог выглядеть почти так же, как и при самой высокой настройке. PolEpie исправил проблему с ограничением яркости, поэтому регулировка мягкости работает и на расстоянии.
Перетащите разделитель, чтобы сравнить один и тот же вид при значении жесткости теней 0 до и после исправления.
Более сглаженные края резких теней
Еще одно изменение по сравнению с PolEpie уменьшает повторяющиеся зубцы вдоль жестких краев направленных теней при наивысшем качестве фильтра теней. Фильтр переходит от жесткости к мягкости по мере ее увеличения, сохраняя исходный мягкий вид при нулевой жесткости и используя то же максимальное количество сравнительных образцов — 16.
На этих снимках «до» и «после» применена описанная выше коррекция каскадной жесткости, поэтому они демонстрируют дополнительное улучшение фильтрации. При более низком качестве фильтра теней и локальном освещении сохраняется существующая фильтрация.
Больше никаких движущихся темных линий
В сценах с множеством локальных источников света, отбрасывающих тени, могли появляться темные линии на поверхностях, которые перемещались по мере движения камеры. Компания CorentArts выяснила, что это связано с вычислением нормали приемника тени внутри светового контура, где соседние пиксели могли двигаться по разным траекториям.
Теперь мы вычисляем эту нормаль перед циклом и передаем её в код теневого отображения. Пользовательские шейдеры могут делать то же самое с помощью новых перегрузок явного вычисления нормалей для Light::From, Light::Initи Light::Shadows. Спасибо CorentArts за исправление и всем, кто предоставил примеры в первоначальном отчете .
Ортографические проекции
Сэм также исправил искаженные тени в экранном пространстве на ортогональных видах. Этот метод предполагает использование перспективной камеры, поэтому теперь мы пропускаем маску теней для ортогональных камер.