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

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

Поддержка HDR с режимом отображения тонов холста

Веб-разработчики имеют ограниченные возможности для доставки 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.

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

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

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

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

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

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

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

  • 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 .

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

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

Что нового в WebGPU

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

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113