Что нового в WebGPU (Chrome 155–156)

Расширение fragment_depth для WGSL

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

Если вы хотите узнать больше о том, как оборудование обрабатывает эту ситуацию, прочитайте статью Мэтью Петтаса Когда нужно отключать раннюю проверку Z-буфера?.

Манипулирование глубиной в фрагментном шейдере может быть полезным, но оно влечет за собой скрытые издержки. Запись в @builtin(frag_depth) внутри фрагментного шейдера обычно приводит к тому, что драйверы отключают раннюю оптимизацию Z-буфера для всего вызова отрисовки. Это происходит потому, что эвристические методы драйвера не могут гарантировать, что глубина, рассчитанная шейдером, соответствует глубине, интерполированной растеризатором.

Чтобы избежать снижения производительности, расширение WGSL fragment_depth позволяет указать название режима глубины less или greater в @builtin(frag_depth), чтобы явно указать, как записанная глубина соотносится с интерполированной. Это позволяет графическому процессору безопасно применять оптимизацию раннего Z-буфера.

Расширение языка можно обнаружить в JavaScript с помощью navigator.gpu.wgslLanguageFeatures. Рекомендуется использовать директиву requires, чтобы указать на потенциальную непортируемость с помощью requires fragment_depth; в верхней части кода шейдера WGSL. Ознакомьтесь с примером ниже и намерением реализовать.

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires fragment_depth;

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

Невыровненное сжатие текстур

Функция графического процессора texture-compression-unaligned позволяет создавать сжатые текстуры с размерами, которые не являются целыми числами, кратными размеру блока (например, 4x4 для форматов BC, ETC2 и ASTC). Ранее WebGPU строго требовал, чтобы размеры текстур соответствовали границам этих блоков. Эта функция позволяет избежать необходимости дополнять или масштабировать текстуры, чтобы они соответствовали выравниванию блоков, и сохранить исходное качество сжатия без искажений, связанных с масштабированием. Подробнее о намерении реализовать функцию…

В приведенном ниже фрагменте кода проверяется, поддерживает ли адаптер сжатие текстур без выравнивания, и, если да, запрашивается устройство с этой функцией.

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

Большое спасибо внешнему участнику Игнасио Кастаньо за разработку этой функции!

Цветовые пространства srgb-linear и display-p3-linear

Благодаря добавлению стандартных цветовых пространств srgb-linear и display-p3-linear контекст холста WebGPU теперь может выполнять отрисовку непосредственно в линейных цветовых пространствах расширенного диапазона для поддержки дисплеев с широкой цветовой гаммой. В этих цветовых пространствах сохраняется линейная зависимость между значениями пикселей и физической яркостью. Благодаря этому они идеально подходят для физически корректного рендеринга света в играх, а также для пространственной обработки, например сглаживания, интерполяции и децимации. Ознакомьтесь с намерением реализовать функцию и примером запроса на добавление частиц (HDR) № 574.

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",
  colorSpace: "display-p3-linear",
});

Дополнительный формат вершин snorm10-10-10-2

Формат вершин "snorm10-10-10-2" – это упакованный 32-битный формат, содержащий четыре нормализованных значения со знаком: три 10-битных компонента (r, g, b) и один 2-битный компонент (a). Этот формат позволяет эффективно хранить атрибуты, например 3D-векторы нормалей с дополнительным 2-битным скаляром или флагом выравнивания, экономя при этом пропускную способность памяти. Подробнее о спецификации PR 6491…

Поддержка f16 в Linux для NVIDIA

Дополнительная функция shader-f16, которая обеспечивает поддержку 16-битных значений с плавающей запятой в WGSL, теперь поддерживается в Linux для последних версий драйверов NVIDIA GPU. Подробнее о проблеме chromium:42251215…

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

Теперь вы можете запросить LUID базового DXGIAdapter для определенного адаптера GPU, используя структуру WGPUAdapterPropertiesD3D. Подробнее о проблеме chromium:562849566…

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

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