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

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

Опубликовано: 22 октября 2025 г.

Расширены возможности поддержки форматов текстур.

Новая функция GPU "texture-formats-tier1" позволяет разработчикам переносить существующий контент в веб без необходимости переписывать его для более низких возможностей WebGPU. Она поддерживает новые форматы текстур "r16unorm" , "r16snorm" , "rg16unorm" , "rg16snorm" , "rgba16unorm" и "rgba16snorm" с возможностью рендеринга, смешивания, мультисэмплирования и доступом к текстуре в режиме "read-only" или "write-only" . Она также позволяет использовать существующие форматы текстур "r8snorm" , "rg8snorm" , "rgba8snorm" с возможностью рендеринга, смешивания, мультисэмплирования и разрешения. Также можно использовать больше форматов текстур с доступом к текстуре в режиме "read-only" или "write-only" .

Новая функция GPU "texture-formats-tier2" обеспечивает доступ к текстурам в режиме "read-write" для определенных форматов, что крайне важно для таких проектов, как портирование Unreal Engine в веб-среду. Обратите внимание, что включение "texture-formats-tier2" при создании устройства автоматически включает "texture-formats-tier1" .

См. следующий фрагмент кода и запись в chromestatus .

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

const requiredFeatures = [];
if (adapter.features.has("texture-format-tier1")) {
  requiredFeatures.push("texture-format-tier1");
}
if (adapter.features.has("texture-format-tier2")) {
  requiredFeatures.push("texture-format-tier2");
}
const device = await adapter.requestDevice({ requiredFeatures });

// Later on, when dealing with "r8unorm" texture formats for example...
if (device.features.has("texture-format-tier2")) {
  // Use "read-write" storage texture access...
} else if (device.features.has("texture-format-tier1")) {
  // Use "read-only" or "write-only" storage texture access...
} else {
  // Fallback: Use another texture format...
}

Огромное спасибо сотрудникам Intel за их работу!

Примитивный индекс в WGSL

primitive_index — это встроенное значение WGSL, которое однозначно идентифицирует текущий примитив (например, точку, линию или треугольник), обрабатываемый фрагментным шейдером. Оно начинается с 0, увеличивается на 1 после обработки каждого примитива и сбрасывается до 0 между каждым отрисованным экземпляром.

Если в GPUAdapter доступна функция "primitive-index" , запросите GPUDevice с этой функцией, чтобы получить поддержку примитивных индексов в WGSL, и явно включите это расширение в вашем коде WGSL с помощью enable primitive_index; После включения используйте встроенное целочисленное значение primitive_index в вашем фрагментном шейдере для доступа к данным каждого примитива или выполнения логики, которая различается для каждой отдельной геометрической фигуры, например.

Приведённый ниже фрагмент кода демонстрирует фрагментный шейдер, который отображает второй примитив красным цветом, а все остальные примитивы — синим.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("primitive-index")) {
  throw new Error("Primitive index support is not available");
}
// Explicitly request primitive index support.
const device = await adapter.requestDevice({
  requiredFeatures: ["primitive-index"],
});

const fragmentShaderModule = device.createShaderModule({ code: `
  enable primitive_index;

  @fragment
  fn main(@builtin(primitive_index) i : u32) -> @location(0) vec4f {
    if (i == 1) {
      return vec4f(1, 0, 0, 1);
    }
    return vec4f(0, 1, 0, 1);
  }`,
});
// Send the appropriate commands to the GPU...

Узнайте больше, ознакомившись с примером Primitive Picking и записью chromestatus .

Треугольники в 3D-модели чайника окрашены в соответствии с их индексами примитивов.
Пример примитивного выбора элементов в режиме "примитивных индексов".

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

Переменная CMake DAWN_BUILD_MONOLITHIC_LIBRARY , используемая для управления типом собираемой монолитной библиотеки, изменила свое значение по умолчанию с OFF на STATIC , так что по умолчанию будут сгенерированы файлы libwebgpu* .

Теперь Dawn корректно обрабатывает значение по умолчанию wgpu::PresentMode::Undefined при настройке wgpu::Surface . См. проблему 441410668 .

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

Что нового в 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