Что нового в 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 s в подгруппе.
  • subgroupExclusiveMul(value) : Возвращает произведение всех активных вызовов value s в подгруппе, полученное в результате эксклюзивного сканирования.

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

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

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

  • 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 из вызова quadBroadcast с идентификатором, равным id . id должен быть константным выражением.
  • quadSwapX(value) : Меняет местами value между вызовами в квадранте в направлении X.
  • quadSwapY(value) : Меняет местами value между вызовами в квадранте в направлении Y.
  • quadSwapDiagonal(value) : Меняет местами value между вызовами в диагонали квадрата.

Утренние обновления

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

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

Здесь описаны лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком изменений .

Что нового в WebGPU?

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

Хром 144

Хром 143

Хром 142

Хром 141

Хром 140

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