Что нового в 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 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 между вызовами в квадрате по диагонали.

Обновления Dawn

Структура 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» .

Хром 139

Хром 138

Хром 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