Что нового в WebGPU (Chrome 149–150)

François Beaufort
François Beaufort

Дата публикации: 17 июня 2026 г.

Непосредственные

Непосредственные значения, также известные как константы push или корневые константы, позволяют передавать небольшие объемы часто меняющихся данных непосредственно в шейдеры. При этом не нужно создавать буферы GPU и управлять группами привязки.

Обновление привязок единообразного буфера для данных, которые меняются при каждом вызове отрисовки, например уникального идентификатора объекта или матрицы трехмерного преобразования для сотен объектов, создает нагрузку на центральный процессор. Внедряйте необработанные значения непосредственно в кодировщик прохода, чтобы избежать записи данных в память и управления поиском на GPU.

Непосредственные значения позволяют быстро работать с небольшими динамическими переменными. Используйте единые буферы или буферы хранения для больших массивов данных, сложных структур освещения или больших матриц.

В шейдере WGSL адресное пространство <immediate> позволяет определять непосредственные данные, которые можно передавать напрямую кодировщику прохода. Вызовите setImmediates() в JavaScript перед вызовом отрисовки, чтобы предоставить эти данные без привязки группы. Чтобы проверить, поддерживается ли immediate_address_space расширение, определите его наличие с помощью navigator.gpu.wgslLanguageFeatures. Ознакомьтесь с примером ниже и намерением отправить.

if (!navigator.gpu.wgslLanguageFeatures.has('immediate_address_space')) {
   throw new Error(`WGSL immediate address space is not available`);
}

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

const module = device.createShaderModule({ code: `
  requires immediate_address_space;

  var<immediate> color: vec4f;

  @vertex fn vertexMain(@builtin(vertex_index) i : u32) -> @builtin(position) vec4f {
    const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
    return vec4f(pos[i], 0, 1);
  }

  @fragment fn fragmentMain() -> @location(0) vec4f {
    return color;
  }`,
});

// Create render pass encoder (omitted)...

// By using layout: 'auto', WebGPU will automatically infer the `immediateSize`
// required by the pipeline layout from the WGSL module.
const pipeline = device.createRenderPipeline({
  layout: 'auto',
  vertex: { module },
  fragment: { module, targets: [{ format }] },
});
myRenderPassEncoder.setPipeline(pipeline);

// Send immediate data to the GPU, then issue a draw call
myRenderPassEncoder.setImmediates(/*rangeOffset=*/0, new Float32Array([255, 0, 0, 255]));
myRenderPassEncoder.draw(3);
myRenderPassEncoder.end();

Подробнее об этой функции можно узнать на сайте WebGPUFundamentals Immediates.

Благодарим команду Microsoft за вклад в развитие проекта!

Более строгая проверка временных прикрепленных файлов

В WebGPU недавно был добавлен флаг TRANSIENT_ATTACHMENT GPUTextureUsage, который позволяет разработчикам создавать временные прикрепления для отрисовки, например буферы глубины и трафарета или многократно сэмплированные цели. Эти прикрепленные файлы хранятся в быстрой встроенной памяти без выделения основной видеопамяти.

Недавние обновления (#6248 и #6267) уточняют правила проверки, чтобы предотвратить неправильное использование этих эффективных с точки зрения памяти прикрепленных текстур:

  • Из-за ограничений платформы при создании временных текстур viewFormats должен быть пустым массивом. Альтернативные форматы просмотра не нужны, поскольку временные текстуры используются только для отрисовки.
  • Создание представления текстуры не приводит к сужению списка флагов использования. При вызове createView() для временной текстуры представление не может изменить ее использование.
  • Временные прикрепления нельзя использовать в качестве resolveTarget в проходе отрисовки.

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

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

Что нового в WebGPU

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

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113