Расстояния клипов в WGSL
Расстояния отсечения позволяют ограничить объём отсечения примитивов с помощью определяемых пользователем полупространств на выходе этапа вершин. Определение собственных плоскостей отсечения обеспечивает больший контроль над видимым содержимым сцен WebGPU. Этот метод особенно полезен для таких приложений, как САПР, где точный контроль над визуализацией критически важен.
Если функция "clip-distances"
доступна в GPUAdapter, запросите GPUDevice с этой функцией, чтобы получить поддержку расстояний отсечения в WGSL, и явно включите это расширение в коде WGSL с помощью enable clip_distances;
После включения вы сможете использовать встроенный массив clip_distances
в вершинном шейдере. Этот массив хранит расстояния до пользовательской плоскости отсечения:
- Расстояние отсечения, равное 0, означает, что вершина лежит на плоскости.
- Положительное расстояние означает, что вершина находится внутри отсекаемого полупространства (стороны, которую вы хотите сохранить).
- Отрицательное расстояние означает, что вершина находится вне отсекаемого полупространства (стороны, которую вы хотите отбросить).
См. следующий фрагмент, запись chromestatus и проблему 358408571 .
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
requiredFeatures: ["clip-distances"],
});
const vertexShaderModule = device.createShaderModule({ code: `
enable clip_distances;
struct VertexOut {
@builtin(clip_distances) my_clip_distances : array<f32, 1>,
@builtin(position) my_position : vec4f,
}
@vertex fn main() -> VertexOut {
var output : VertexOut;
output.my_clip_distances[0] = 1;
output.my_position = vec4f(0, 0, 0, 1);
return output;
}
`,
});
// Send the appropriate commands to the GPU...
GPUCanvasContext getConfiguration()
После вызова метода GPUCanvasContext configure()
со словарём конфигурации метод GPUCanvasContext getConfiguration()
позволяет проверить конфигурацию контекста холста. Он включает в себя элементы device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
и alphaMode
. Это полезно для таких задач, как проверка поддержки HDR-холста браузером, как показано в примере Particles (HDR) . См. следующий фрагмент кода, запись chromestatus и номер проблемы 370109829 .
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
// Configure the canvas for HDR.
context.configure({
device,
format: "rgba16float",
toneMapping: { mode: "extended" },
});
const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
// The browser supports HDR canvas.
// Warning! The user still needs a HDR display to enjoy HDR content.
}
Точечные и линейные примитивы не должны иметь смещения глубины.
Как было объявлено ранее , спецификация WebGPU теперь делает ошибкой валидации установку ненулевых значений для параметров depthBias
, depthBiasSlopeScale
и depthBiasClamp
, если топология конвейера рендеринга представляет собой линию или точку. См. проблему 352567424 .
Встроенные функции сканирования для подгрупп
В рамках экспериментов с подгруппами в выпуске 361330160 были добавлены следующие встроенные функции подгрупп:
-
subgroupInclusiveAdd(value)
: возвращает инклюзивную сумму сканирования всех активных вызововvalue
s в подгруппе. -
subgroupInclusiveMul(value)
: возвращает инклюзивное сканирование умножения всех активных вызововvalue
s в подгруппе.
Экспериментальная поддержка многоразового косвенного вывода
Функция многомерной непрямой отрисовки GPU позволяет выполнять несколько вызовов отрисовки одной командой GPU. Это особенно полезно в ситуациях, когда требуется отрисовка большого количества объектов, например, систем частиц, инстансинга и больших сцен. Методы drawIndirect()
и drawIndexedIndirect()
класса GPURenderPassEncoder могут выполнять только один вызов отрисовки за раз из определённой области буфера GPU.
Пока эта экспериментальная функция не стандартизирована , включите флаг «Поддержка небезопасного WebGPU» на chrome://flags/#enable-unsafe-webgpu
, чтобы она стала доступна в Chrome.
Используя нестандартную функцию графического процессора "chromium-experimental-multi-draw-indirect"
доступную в GPUAdapter, запросите GPUDevice с этой функцией. Затем создайте GPUBuffer с использованием GPUBufferUsage.INDIRECT
для хранения вызовов отрисовки. Вы сможете использовать его позже в новых методах multiDrawIndirect()
и multiDrawIndexedIndirect()
GPURenderPassEncoder для выполнения вызовов отрисовки внутри прохода рендеринга. См. следующий фрагмент кода и ошибку 356461286 .
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});
// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
3, 1, 0, 0, // First draw call
3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
size: drawData.byteLength,
usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);
// Create a render pipeline, a vertex buffer, and a render pass encoder...
// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();
Опция компиляции модуля шейдера строгая математика
В GPUShaderModuleDescriptor добавлен логический параметр разработчика strictMath
, позволяющий включать и отключать строгую математику во время компиляции модуля шейдера. Он доступен с помощью флага «WebGPU Developer Features» по адресу chrome://flags/#enable-webgpu-developer-features
, что означает, что эта функция предназначена только для использования во время разработки. См. issue 42241455 .
Эта опция в настоящее время поддерживается в Metal и Direct3D. При отключении строгой математики компилятор может оптимизировать ваши шейдеры следующим образом:
- Игнорирование возможности значений NaN и Infinity.
- Рассматриваем -0 как +0.
- Замена деления более быстрым умножением на обратную величину.
- Перестановочные операции, основанные на ассоциативных и распределительных свойствах.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `
// Examines the bit pattern of the floating-point number to
// determine if it represents a NaN according to the IEEE 754 standard.
fn isNan(x : f32) -> bool {
bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
return ones_exp && non_zero_sig;
}
// ...
`;
// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });
Удалить GPUAdapter requestAdapterInfo()
Асинхронный метод requestAdapterInfo()
класса GPUAdapter избыточен, поскольку GPUAdapterInfo уже можно получить синхронно с помощью атрибута info
класса GPUAdapter. Поэтому нестандартный метод requestAdapterInfo()
класса GPUAdapter теперь удалён. См. намерение удалить .
Обновления Dawn
Исполняемый файл tint_benchmark
измеряет стоимость перевода шейдеров из WGSL на каждый язык бэкенда. Подробнее об этом читайте в новой документации .
Здесь рассматриваются лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком коммитов .
Что нового в WebGPU
Список всего, что было рассмотрено в серии « Что нового в WebGPU» .
Хром 139
- Поддержка 3D-текстур для сжатых форматов BC и ASTC
- Новая функция «основные функции и ограничения»
- Пробная версия Origin для режима совместимости с WebGPU
- Обновления Dawn
Хром 138
- Сокращение для использования буфера в качестве связующего ресурса
- Изменения требований к размеру буферов, отображаемых при создании
- Отчет об архитектуре последних графических процессоров
- Отменить атрибут GPUAdapter isFallbackAdapter
- Обновления Dawn
Хром 137
- Использовать вид текстуры для привязки externalTexture
- Буферы копируются без указания смещения и размера
- WGSL workgroupUniformLoad с использованием указателя на атомарный
- Атрибут powerPreference GPUAdapterInfo
- Удалить атрибут совместимости GPURequestAdapterOptions
- Обновления Dawn
Хром 136
- GPUAdapterInfo — атрибут FallbackAdapter
- Улучшение времени компиляции шейдера на D3D12
- Сохраняйте и копируйте изображения холста
- Ограничения режима совместимости
- Обновления Dawn
Хром 135
- Разрешить создание макета конвейера с макетом группы нулевых привязок
- Разрешить областям просмотра выходить за границы целевых объектов рендеринга
- Более простой доступ к экспериментальному режиму совместимости на Android
- Удалить ограничение maxInterStageShaderComponents
- Обновления Dawn
Хром 134
- Улучшите рабочие нагрузки машинного обучения с помощью подгрупп
- Удалить поддержку плавающих фильтруемых текстур как смешиваемых.
- Обновления Dawn
Хром 133
- Дополнительные форматы вершин unorm8x4-bgra и 1-компонентные
- Разрешить запрашивать неизвестные лимиты с неопределенным значением
- Изменения правил выравнивания WGSL
- Повышение производительности WGSL за счет отмены
- Используйте VideoFrame displaySize для внешних текстур
- Обработка изображений с ориентацией, отличной от стандартной, с помощью copyExternalImageToTexture
- Улучшение опыта разработчиков
- Включить режим совместимости с featureLevel
- Экспериментальная подгруппа функций очистки
- Отменить ограничение maxInterStageShaderComponents
- Обновления Dawn
Хром 132
- Использование вида текстуры
- Смешивание 32-битных плавающих текстур
- Атрибут GPUDevice adapterInfo
- Настройка контекста холста с недопустимым форматом приводит к ошибке JavaScript
- Фильтрация ограничений сэмплера на текстуры
- Расширенные эксперименты с подгруппами
- Улучшение опыта разработчиков
- Экспериментальная поддержка 16-битных нормализованных форматов текстур
- Обновления Dawn
Хром 131
- Расстояния клипов в WGSL
- GPUCanvasContext getConfiguration()
- Точечные и линейные примитивы не должны иметь смещения глубины.
- Встроенные функции сканирования для подгрупп
- Экспериментальная поддержка многоразового косвенного вывода
- Опция компиляции модуля шейдера строгая математика
- Удалить GPUAdapter requestAdapterInfo()
- Обновления Dawn
Хром 130
- Смешивание двух источников
- Улучшение времени компиляции шейдеров на Metal
- Устаревание GPUAdapter requestAdapterInfo()
- Обновления Dawn
Хром 129
- Поддержка HDR с режимом тональной компрессии на холсте
- Расширенная поддержка подгрупп
- Обновления Dawn
Хром 128
- Эксперименты с подгруппами
- Отменить настройку смещения глубины для линий и точек
- Скрыть предупреждение DevTools об ошибке, если preventDefault
- WGSL сначала интерполирует выборку, а затем либо
- Обновления Dawn
Хром 127
- Экспериментальная поддержка OpenGL ES на Android
- Атрибут информации GPUAdapter
- Улучшения взаимодействия с WebAssembly
- Улучшены ошибки кодировщика команд
- Обновления Dawn
Хром 126
- Увеличить лимит maxTextureArrayLayers
- Оптимизация загрузки буфера для бэкэнда Vulkan
- Улучшение времени компиляции шейдера
- Отправленные буферы команд должны быть уникальными.
- Обновления Dawn
Хром 125
Хром 124
- Текстуры хранения данных, доступные только для чтения и для чтения и записи
- Поддержка работников сферы услуг и коллективных работников
- Новые атрибуты информации об адаптере
- Исправления ошибок
- Обновления Dawn
Хром 123
- Поддержка встроенных функций DP4a в WGSL
- Неограниченные параметры указателя в WGSL
- Синтаксический сахар для разыменования композитов в WGSL
- Отдельное состояние «только для чтения» для аспектов трафарета и глубины
- Обновления Dawn
Хром 122
- Расширение охвата с помощью режима совместимости (функция в разработке)
- Увеличить лимит maxVertexAttributes
- Обновления Dawn
Хром 121
- Поддержка WebGPU на Android
- Используйте DXC вместо FXC для компиляции шейдеров в Windows
- Запросы временных меток в проходах вычислений и рендеринга
- Точки входа по умолчанию в шейдерные модули
- Поддержка display-p3 как цветового пространства GPUExternalTexture
- Информация о кучах памяти
- Обновления Dawn
Хром 120
- Поддержка 16-битных значений с плавающей запятой в WGSL
- Раздвинь границы
- Изменения в состоянии трафарета глубины
- Обновления информации об адаптере
- Квантование запросов по временным меткам
- Особенности генеральной уборки
Хром 119
- Фильтруемые 32-битные плавающие текстуры
- формат вершин unorm10-10-10-2
- формат текстуры rgb10a2uint
- Обновления Dawn
Хром 118
- Поддержка HTMLImageElement и ImageData в
copyExternalImageToTexture()
- Экспериментальная поддержка текстур хранения данных для чтения и записи и только для чтения
- Обновления Dawn
Хром 117
- Сбросить буфер вершин
- Отменить привязку группы
- Ошибки тишины при создании асинхронного конвейера при потере устройства
- Обновления создания шейдерного модуля SPIR-V
- Улучшение опыта разработчиков
- Кэширование конвейеров с автоматически сгенерированной компоновкой
- Обновления Dawn
Хром 116
- Интеграция WebCodecs
- Потерянное устройство, возвращенное GPUAdapter
requestDevice()
- Сохраняйте плавность воспроизведения видео, если вызывается
importExternalTexture()
- Соответствие спецификациям
- Улучшение опыта разработчиков
- Обновления Dawn
Хром 115
- Поддерживаемые расширения языка WGSL
- Экспериментальная поддержка Direct3D 11
- Получите дискретный графический процессор по умолчанию при питании от сети переменного тока
- Улучшение опыта разработчиков
- Обновления Dawn
Хром 114
- Оптимизировать JavaScript
- getCurrentTexture() на ненастроенном холсте выдает InvalidStateError
- Обновления WGSL
- Обновления Dawn