Render Graph на Rust и Vulkan

ollalala 52 минуты назад Краткое содержание статьи Render Graph на Rust и Vulkan Сложный 10 мин 446 Rust * Мнение В большей степени эта статья будет полезна тем, кто уже пытался реализовать или реализовал свои сложные...
Will Anthropic have the best AI model at the end of October 2026?
Значимый прорыв формирует отрасль ИИ: ollalala 52 минуты назад Краткое содержание статьи Render Graph на Rust и Vulkan Сложный 10 мин 446 Rust * Мнение В большей степени эта статья будет полезна тем, кто уже пытался реализовать или реализовал свои сложные рендеры на Vulkan. Я лишь расскажу, как пытался организовать современный Vulkan-код, чтобы получить его эффективность и гибкость. Каждый, кто имеет хоть какой-нибудь опыт работы с Vulkan, задавался вопросом, как правильно его организовать.
Какие платформы поддерживать? Какие фичи GPU считать обязательными, а какие опциональными? Можно ли поддерживать вообще все?
Технические детали
А еще многопоточность и async compute... Самая большая проблема - то, что GPU очень разные (IMR vs TBDR, UMA vs Discrete). Когда пытаешься описать все это разнообразие одним API и поддержать его целиком, приходишь к веткам, очень большим веткам кода.
3 устраняет множество проблем и, особенно для ПК, сокращает объем кода, поэтому я рекомендовал бы начинать сразу с него. Со временем разница между GPU становится все меньше, и полностью ПК-рендер с небольшими доработками (а то и без них) можно будет запустить на мобильных устройствах. Чтобы все же дойти до работающего результата, я взял за основу профиль VP_LUNARG_desktop_baseline_2024 и брал оттуда все расширения и большинство лимитов, форматов и фич.
Профиль гарантирует, что GPU поддерживает определенный минимальный набор возможностей, хотя на реальном устройстве лимиты, скорее всего, выше. Из-за многословности Vulkan и объема темы дальше я опишу только самые важные по моему мнению вещи, главное чтобы была понятна идея:pub struct impl RenderContext { pub fn new(window: &Window) -> }Структура RenderContext (она возвращается как Arc) инициализирует и хранит основной набор Vulkan-объектов: device, queue и GPU-аллокаторы. Я с самого начала заложил в нее Send и Sync, хотя бы для того, чтобы glTF-модель можно было целиком создавать в другом потоке, не затрагивая основной.
Отраслевые последствия
Честно говоря, я до сих пор не знаю, стоило ли делать это сразу или было бы проще добавить многопоточность позже, уже имея однопоточный рендерер. Затем я написал большую структуру, которая создает «голые» vk-объекты и управляет ими через Handle. Handle - это легкая структура-идентификатор объекта, а для работы с такими идентификаторами давно есть готовый crate - slotmap.
Handle-based подход можно увидеть в докладе Frostbite на GDC, «FrameGraph: Extensible Rendering Architecture in Frostbite»: там любой ресурс - лишь непрозрачный идентификатор (idResource), с которым работает FrameGraph. Я поступил так же и для долгоживущих ресурсов, и для временных.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.



