WebGPU – это новый графический API, который объединяет Vulkan, Metal и D3D12 под единым интерфейсом и позволяет оптимально использовать возможности видеокарт в браузерах. WebGPU одновременно будет стандартом W3C и C-библиотекой, которую можно использовать в нативных приложениях – это делает ее на сегодняшний день самой перспективной заменой OpenGL для кроссплатформенной разработки.

WebGPU решает следующие проблемы OpenGL:

  • Отсутствие потоковой безопасности;
  • Модифицируемое состояние, неявная синхронизация;
  • Высокая покадровая нагрузка;
  • Перегруженность, исторически накопившееся множество различных способов делать одно и то же;
  • Отсутствие поддержки на macOS;
  • Не вполне однозначная семантика шейдерного языка GLSL, скрытые “сюрпризы” в видеодрайверах.

WebGPU выгодно отличается от bgfx и других подобных решений тем, что это будет стандарт, поддерживаемый крупнейшими софтверными корпорациями – следовательно, исключены vendor lock-in, непредвиденные поломки обратной совместимости и другие неприятные ситуации.

Есть высокая вероятность, что я постепенно откажусь от OpenGL в пользу WebGPU в своих будущих разработках – это будет происходить по мере того, как стабилизируется wgpu-native. В настоящее время API еще не готов к использованию в реальном продакшне.

В этом разделе блога я буду выкладывать материалы по WebGPU, свои и чужие – статьи, уроки, примеры, демки.

Свободные реализации

  • wgpu – реализация от Mozilla, которая войдет в Firefox. Написана на языке Rust.
  • wgpu-native – C-шный API для wgpu. Пока самая удобная для использования на практике реализация.
  • Dawn – реализация на C++ от Google, которая войдет в Chromium.

Биндинги

  • bindbc-wgpu – динамический BindBC-биндинг к wgpu-native для D, мой проект.
  • wgpu-d – статический биндинг к wgpu-native для D, включает также тонкий враппер, делающий работу с API более удобной.
  • wgpu-py – биндинг к wgpu-native для Python.

Мои статьи

Мои демки

  • wgpu-dlang – пример использования WebGPU на D. По сути, это основа для графического движка. Реализованы загрузка моделей OBJ, загрузка текстур, создание мип-уровней, рендеринг с использованием GGX BRDF. Используется биндинг bindbc-wgpu.

Шейдерные языки

В WebGPU есть встроенный шейдерный язык WGSL, нативные реализации также поддерживают SPIR-V. При желании можно использовать GLSL и компилировать шейдеры в SPIR-V при помощи GLSLang. Вот мои аргументы за и против обоих вариантов:

  • WGSL избавляет от необходимости встраивать компилятор в приложение или компилировать шейдеры на этапе сборки, что упрощает работу над маленькими проектами. Однако WGSL – это новый язык, несовместимый с другими графическими API и имеющий непривычный синтаксис. Поэтому если ваша цель – портировать на WebGPU готовый проект или поддерживать в движке несколько графических API, будет гораздо проще использовать GLSL. В противном случае используйте WGSL. WGSL разработан специально для WebGPU, поэтому он полностью учитывает специфику этой технологии, что делает его удобным выбором для проектов, создаваемых с нуля.
  • GLSL – устоявшийся стандарт, совместимый с Vulkan. Хотя GLSL под OpenGL и GLSL под Vulkan – это разные диалекты языка, между ними сохраняется высокая степень совместимости. Также при помощи трансляторов вы можете перевести готовые GLSL-шейдеры на любой другой язык, включая WGSL, SPIR-V и HLSL, что обеспечивает максимальную переносимость. Минусом такого подхода является необходимость встраивать в проект дополнительные инструменты для сборки шейдеров, что не всегда может быть удобно. Еще один плюс, особенно для крупных проектов – можно скомпилировать шейдеры один раз и закэшировать SPIR-V-модули, ускорив таким образом инициализацию приложения, ведь трансляция SPIR-V под целевые платформы на стороне бэкенда WebGPU намного эффективнее, чем полный процесс парсинга и компиляции текстового языка.

В WegGPU-приложение на D можно встроить GLSLang при помощи моего биндинга bindbc-glslang.