Как стать автором
Обновить
35.58

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

Время на прочтение5 мин
Количество просмотров1.2K

Представьте, что вы можете запустить 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, поделитесь своим опытом в комментариях! Если нет, то чего вы ждете от этого стандарта? Какие проекты вы хотели бы реализовать с его помощью? Давайте обсудим!

Теги:
Хабы:
Всего голосов 4: ↑3 и ↓1+4
Комментарии6

Публикации

Информация

Сайт
digitalleague.ru
Дата регистрации
Численность
5 001–10 000 человек
Местоположение
Россия