Что нового в WebGPU (Chrome 129)

Франсуа Бофор
François Beaufort

Поддержка HDR с режимом тональной компрессии Canvas

Веб-разработчики имеют ограниченные возможности для доставки HDR-контента, полагаясь в основном на элементы <img> и <video> . Однако элемент <canvas> остается ограниченным SDR. Создание динамического HDR-контента в холсте требует кодирования его содержимого в HDR-изображение перед его отображением (пример см. в этой демонстрации ).

Новый параметр GPUCanvasToneMappingMode в конфигурации холста WebGPU теперь позволяет WebGPU рисовать цвета ярче белого ( #FFFFFF ). Он делает это с помощью следующих режимов:

  • "standard" : Поведение по умолчанию ограничивает контент диапазоном SDR экрана. Этот режим достигается путем фиксации всех цветовых значений в цветовом пространстве экрана до интервала [0, 1] .

  • "extended" : Разблокирует полный диапазон HDR экрана. Этот режим соответствует "standard" в диапазоне [0, 1] экрана. Зажим или проекция выполняется для расширенного динамического диапазона экрана, но не [0, 1] .

В следующем фрагменте кода показано, как настроить холст для расширенного динамического диапазона.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

context.configure({
  device,
  format: "rgba16float",
  toneMapping: { mode: "extended" },
});

Изучите HDR с WebGPU, изучив примеры Particles (HDR) и WebGPU HDR , а также ознакомьтесь с записью chromestatus .

Ноутбук с HDR-экраном, демонстрирующим яркое изображение.
Образец частиц (HDR), отображаемый на экране HDR.

Расширенная поддержка подгрупп

После объявления о подгруппах experimental , встроенные функции подгрупп теперь доступны для использования как в вычислительных шейдерах, так и в фрагментных шейдерах. Они больше не ограничены только вычислительными шейдерами. См. issue 354738715 .

Обратите внимание, что встроенное значение subgroup_size в настоящее время глючит в шейдерах фрагментов. Избегайте его пока.

Кроме того, были добавлены следующие встроенные функции подгрупп:

  • subgroupAdd(value) : возвращает сумму всех активных вызовов value s в подгруппе.
  • subgroupExclusiveAdd(value) : возвращает эксклюзивную сумму сканирования всех активных вызовов value s в подгруппе.
  • subgroupMul(value) : возвращает произведение всех активных вызовов value s в подгруппе.
  • subgroupExclusiveMul(value) : возвращает исключительное сканирующее умножение всех активных вызовов value s в подгруппе.

  • subgroupAnd(value) : возвращает двоичное И всех активных вызовов value s в подгруппе.
  • subgroupOr(value) : возвращает двоичное ИЛИ всех активных вызовов value s в подгруппе.
  • subgroupXor(value) : возвращает двоичный XOR всех активных вызовов value s в подгруппе.

  • subgroupMin(value) : возвращает минимальное значение всех активных вызовов value s в подгруппе.
  • subgroupMax(value) : возвращает максимальное значение всех активных вызовов value s в подгруппе.

  • subgroupAll(value) : возвращает true, если value имеет значение true для всех активных вызовов в подгруппе.
  • subgroupAny(value) : возвращает true, если value имеет значение true для любого активного вызова в подгруппе.

  • subgroupElect() : возвращает true, если этот вызов имеет наименьший subgroup_invocation_id среди активных вызовов в подгруппе.
  • subgroupBroadcastFirst(value) : транслирует value из активного вызова с наименьшим subgroup_invocation_id в подгруппе всем остальным активным вызовам.

  • subgroupShuffle(value, id) : возвращает value из активного вызова, subgroup_invocation_id которого соответствует id .
  • subgroupShuffleXor(value, mask) : возвращает value из активного вызова, subgroup_invocation_id которого соответствует subgroup_invocation_id ^ mask . mask должна быть динамически однородной.
  • subgroupShuffleUp(value, delta) : возвращает value из активного вызова, subgroup_invocation_id которого совпадает с subgroup_invocation_id - delta .
  • subgroupShuffleDown(value, delta) : возвращает value из активного вызова, subgroup_invocation_id которого совпадает с subgroup_invocation_id + delta .

  • quadBroadcast(value, id) : транслирует value из вызова quad с идентификатором, равным id . id должен быть константным выражением.
  • quadSwapX(value) : меняет местами value между вызовами в квадрате по оси X.
  • quadSwapY(value) : меняет местами value между вызовами в квадрате в направлении Y.
  • quadSwapDiagonal(value) : меняет местами value между вызовами в квадрате по диагонали.

Обновления рассвета

Структура wgpu::PrimitiveState теперь напрямую включает настройку управления глубиной клипа, устраняя необходимость в отдельной структуре wgpu::PrimitiveDepthClipControl . Чтобы узнать больше, см. следующий фрагмент кода и PR webgpu-headers .

// Before
wgpu::PrimitiveState primitive = {};
wgpu::PrimitiveDepthClipControl depthClipControl;
depthClipControl.unclippedDepth = true;
primitive.nextInChain = &depthClipControl;
// Now
wgpu::PrimitiveState primitive = {};
primitive.unclippedDepth = true;

Это охватывает только некоторые из ключевых моментов. Ознакомьтесь с исчерпывающим списком коммитов .

Что нового в WebGPU

Список всего, что было рассмотрено в серии « Что нового в WebGPU» .

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113