WebGPU: от медицинских снимков до Cyberpunk 2077

от автора

Представьте, что вы можете запустить Cyberpunk 2077 прямо в браузере. Или визуализировать сложные медицинские данные в реальном времени, не устанавливая никакого дополнительного ПО. Звучит как фантастика? Но это уже скоро может стать реальностью благодаря WebGPU — новому стандарту, который обещает перевернуть мир веб-графики и вычислений. Меня зовут Павел Симонов, я архитектор-эксперт в Лиге Цифровой Экономики. В этой статье мы разберем, что такое WebGPU, почему эта технология так важна, и как она может изменить вашу работу уже сегодня.

Почему это не просто еще +1 стандарт?

Standards

Standards

Если вы работаете в IT или около IT, то наверняка слышали о WebGL — стандарте, который позволил нам запускать 3D-графику в браузере. WebGL был прорывом, но у него есть свои ограничения: сложность использования, недостаточная производительность для современных задач и отсутствие поддержки новых графических API.

WebGPU — это следующий шаг. Это не просто улучшенный WebGL, а совершенно новый подход к работе с GPU в браузере. Он предоставляет низкоуровневый доступ к графическому процессору, что позволяет разработчикам создавать более мощные и производительные приложения. У нас открываются двери для таких вещей, как игры уровня AAA, сложные научные симуляции и более качественные реализации виртуальной реальности.

История создания

История WebGPU началась в 2016 году, когда Google представил концепцию WebGL Next. Это был ответ на растущие потребности разработчиков в более мощных инструментах для работы с графикой. В 2017 году к разработке подключились Apple, Mozilla и другие крупные игроки, и проект получил название WebGPU.

Ключевой момент в истории WebGPU — это его кроссплатформенность. В отличие от WebGL, который был привязан к OpenGL, WebGPU поддерживает современные графические API, такие как DirectX 12Metal и Vulkan. Это значит, что разработчики могут использовать один и тот же стандарт на разных платформах, что значительно упрощает жизнь.

Здесь приведена подробная таблица сравнения стандартов по различным характеристикам:

Почему это так важно?

WebGPU — это низкоуровневый API для работы с GPU в браузере. Он предоставляет разработчикам прямой доступ к графическому процессору, что позволяет создавать более производительные и сложные приложения. Вот три ключевые проблемы, которые решает WebGPU:

  • Производительность: WebGPU обеспечивает более высокую производительность по сравнению с WebGL, особенно в сложных сценах и вычислениях. Это особенно важно для игр, научных симуляций и визуализации данных.

  • Поддержка новых технологий: WebGPU поддерживает современные графические API, такие как DirectX 12, Metal и Vulkan. Это значит, что разработчики могут использовать все возможности современных GPU.

  • Единый стандарт: WebGPU стремится стать единым стандартом для веб-графики, что упрощает разработку кроссплатформенных приложений.

Схематично принцип работы WebGPU можно представить вот так:

WGSL: язык шейдеров для WebGPU

Одной из ключевых особенностей WebGPU является WGSL (WebGPU Shading Language) — язык для написания шейдеров. WGSL разработан специально для WebGPU и предоставляет разработчикам гибкость и контроль над графическим конвейером.

Вот пример двух простых шейдеров на WGSL:

@vertex fn main_vertex(     @location(0) in_position: vec4<f32>,     @location(1) in_color: vec3<f32>,     @builtin(position) out_position: vec4<f32>,     @location(0) out_color: vec3<f32> ) {     out_position = in_position;     out_color = in_color; } @fragment fn main_fragment(     @location(0) in_color: vec3<f32>,     @location(0) out_color: vec4<f32> ) {     out_color = vec4<f32>(in_color, 1.0); }

Здесь мы описываем вершины и цвет треугольника. Просто? Да, но это только начало. WGSL позволяет создавать гораздо более сложные шейдеры, включая вычисления для физических симуляций, постобработки и многого другого.

Пример работы: продолжаем рисовать треугольник

Давайте рассмотрим простой пример работы с WebGPU. Для этого продолжим работать с нашим примером дальше. Для начала нам нужно инициализировать контекст и настроить конвейер отрисовки. Вот как это выглядит:

const canvas = document.createElement('canvas'); const adapter = await navigator.gpu.requestAdapter(); const device = await adapter.requestDevice();  document.body.appendChild(canvas);  const context = canvas.getContext('webgpu'); const presentationFormat = navigator.gpu.getPreferredCanvasFormat();  context.configure({     device,     format: presentationFormat,     alphaMode: 'premultiplied', });

После инициализации мы можем настроить конвейер отрисовки и запустить рендеринг:

const pipeline = device.createRenderPipeline({     layout: 'auto',     vertex: {         module: device.createShaderModule({             code: vertexShaderCode, // в этой переменной находится код нашего первого шейдера, описанного выше         }),         entryPoint: 'main',     },     fragment: {         module: device.createShaderModule({             code: fragmentShaderCode, // в этой переменной находится код нашего второго шейдера, описанного выше         }),         entryPoint: 'main',         targets: [{ format: presentationFormat }],     },     primitive: {         topology: 'triangle-list',     }, });  function frame() {     const commandEncoder = device.createCommandEncoder();     const textureView = context.getCurrentTexture().createView();      const renderPassDescriptor = {         colorAttachments: [             {                 view: textureView,                 clearValue: [0, 0, 0, 1],                 loadOp: 'clear',                 storeOp: 'store',             },         ],     };      const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);     passEncoder.setPipeline(pipeline);     passEncoder.draw(3);     passEncoder.end();      device.queue.submit([commandEncoder.finish()]);     requestAnimationFrame(frame); }  requestAnimationFrame(frame); requestAnimationFrame(frame);

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

Что можно делать уже сейчас?

WebGPU уже поддерживается в последних версиях браузеров, таких как Chrome, Edge и Safari. Это открывает новые возможности для разработки:

  • Веб-игры: С WebGPU можно создавать игры уровня AAA прямо в браузере. Представьте, что вы играете в Cyberpunk 2077 без необходимости скачивать и устанавливать игру.

  • Виртуальная и дополненная реальность: WebGPU позволяет создавать immersive-приложения, которые раньше были возможны только в нативных средах.

  • Научные вычисления: Визуализация медицинских данных, симуляции физических процессов и многое другое — все это теперь возможно в браузере.

  • Графические редакторы: Сложные инструменты для работы с графикой, такие как Photoshop или Blender, могут быть перенесены в веб.

Публичные проекты на WebGPU

Здесь я постарался привести пару примеров проектов:

PixiJS – движок для создания HTML5 игр и приложений;

Veloren — многопользовательская воксельная ролевая игра с расширенной генерацией местности и симуляцией экономики;

Bevy — движок на основе данных, созданный на Rust;

Green Line Extensionавтор сделал попытку проанализировать как продление зеленой ветки метро повлияет на поездки в его городе (относительное время проезда до центра города).

Заключение

WebGPU — это не просто еще одна технология или стандарт. Это будущее веб-графики и вычислений. Он открывает новые горизонты для разработчиков, позволяя создавать приложения, которые раньше были невозможны в браузере.

Если вы хотите узнать больше о WebGPU, рекомендую ознакомиться с официальной документацией на GitHubMDN и Can I use.

А если вы уже пробовали работать с WebGPU, поделитесь своим опытом в комментариях! Если нет, то чего вы ждете от этого стандарта? Какие проекты вы хотели бы реализовать с его помощью? Давайте обсудим!

 


ссылка на оригинал статьи https://habr.com/ru/articles/901248/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *