Расстояние между клипами в WGSL
Ограничение расстояния отсечения позволяет ограничивать объем отсечения примитивов с помощью определяемых пользователем полупространств на выходе вершинного этапа. Определение собственных плоскостей отсечения обеспечивает больший контроль над тем, что видно в сценах WebGPU. Этот метод особенно полезен для таких приложений, как САПР, где точный контроль над визуализацией имеет решающее значение.
Если в GPUAdapter доступна функция "clip-distances" , запросите 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()
После вызова configure() класса GPUCanvasContext с заданным словарем конфигурации, метод getConfiguration() класса GPUCanvasContext позволяет проверить конфигурацию контекста холста. Он включает в себя члены 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): Возвращает сумму всех активных вызововvalues в рамках подгруппы. -
subgroupInclusiveMul(value): Возвращает произведение всех активных вызовов функции в подгруппе, полученное в результате сканирования сvalue.
Экспериментальная поддержка непрямого режима с несколькими вариантами отсчета.
Функция многопотоковой отрисовки с косвенным доступом к графическому процессору позволяет выполнять несколько вызовов отрисовки с помощью одной команды GPU. Это особенно полезно в ситуациях, когда необходимо отрисовать большое количество объектов, например, системы частиц, инстансирование и большие сцены. Методы drawIndirect() и drawIndexedIndirect() класса GPURenderPassEncoder могут выполнять только один вызов отрисовки за раз из определенной области буфера GPU.
Пока эта экспериментальная функция не будет стандартизирована , включите флаг "Unsafe WebGPU Support" по адресу chrome://flags/#enable-unsafe-webgpu чтобы сделать её доступной в Chrome.
Используя нестандартную функцию GPU "chromium-experimental-multi-draw-indirect" доступную в GPUAdapter, запросите GPUDevice с этой функцией. Затем создайте GPUBuffer с использованием GPUBufferUsage.INDIRECT для хранения вызовов отрисовки. Вы можете использовать его позже в новых методах GPURenderPassEncoder multiDrawIndirect() и multiDrawIndexedIndirect() для выполнения вызовов отрисовки внутри прохода рендеринга. См. следующий фрагмент кода и проблему 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 , что означает, что эта функция предназначена только для использования во время разработки. См. проблему 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` теперь удален. См. намерение удалить этот метод.
Утренние обновления
Исполняемый файл tint_benchmark измеряет стоимость преобразования шейдеров из WGSL в каждый из бэкенд-языков. Подробнее об этом можно узнать в новой документации .
Здесь описаны лишь некоторые из ключевых моментов. Ознакомьтесь с полным списком изменений .
Что нового в WebGPU?
Список всего, что было рассмотрено в серии статей «Что нового в WebGPU» .
Хром 144
- Расширение WGSL subgroup_id
- Расширение WGSL uniform_buffer_standard_layout
- WebGPU на Linux
- Более быстрая запись буфера и текстуры
- Утренние обновления
Хром 143
- Компонент текстуры swizzle
- Удалить использование текстур в хранилище только для чтения bgra8unorm
- Утренние обновления
Хром 142
Хром 141
- Завершено тонирование ИК-излучения
- Анализ целочисленных диапазонов в компиляторе WGSL
- Обновление SPIR-V 1.4 для бэкенда Vulkan
- Утренние обновления
Хром 140
- Устройство запрашивает использование адаптера
- Сокращенная запись для использования текстуры там, где используется представление текстуры.
- WGSL textureSampleLevel поддерживает одномерные текстуры.
- Прекратить использование текстур в режиме только для чтения в bgra8unorm
- Удалите атрибут isFallbackAdapter из списка GPUAdapter.
- Утренние обновления
Хром 139
- Поддержка 3D-текстур для сжатых форматов BC и ASTC.
- Новая функция «Основные функции и ограничения»
- Пробная версия Origin для режима совместимости с WebGPU
- Утренние обновления
Хром 138
- Сокращенная запись для использования буфера в качестве ресурса привязки.
- Изменения требований к размеру буферов, отображаемых при создании.
- Архитектурный отчет для современных графических процессоров.
- Устаревший атрибут isFallbackAdapter для GPUAdapter
- Утренние обновления
Хром 137
- Используйте представление текстуры для привязки внешней текстуры.
- Копирование буферов выполняется без указания смещений и размера.
- Рабочая группа WGSL UniformLoad с использованием указателя на атомарную функцию
- Атрибут powerPreference GPUAdapterInfo
- Удалите атрибут compatibilityMode из GPURequestAdapterOptions.
- Утренние обновления
Хром 136
- Атрибут gPUAdapterInfo isFallbackAdapter
- Улучшения времени компиляции шейдеров в D3D12
- Сохраняйте и копируйте изображения холста.
- Ограничения режима совместимости лифта
- Утренние обновления
Хром 135
- Разрешить создание макета конвейера с макетом группы привязки пустого значения
- Разрешите области просмотра выходить за пределы границ целевых областей рендеринга.
- Упрощенный доступ к экспериментальному режиму совместимости на Android.
- Удалите ограничение maxInterStageShaderComponents.
- Утренние обновления
Хром 134
- Оптимизация рабочих нагрузок машинного обучения с помощью подгрупп
- Удалить поддержку типов текстур с возможностью фильтрации (float filterable texture types) как смешиваемых (blendable).
- Утренние обновления
Хром 133
- Дополнительные форматы unorm8x4-bgra и 1-компонентные вершинные форматы
- Разрешить запрос неизвестных лимитов с неопределенным значением.
- Изменения в правилах выравнивания WGSL
- Повышение производительности WGSL за счет отбрасывания
- Используйте параметр `videoFrame displaySize` для внешних текстур.
- Обработка изображений с нестандартной ориентацией осуществляется с помощью функции copyExternalImageToTexture.
- Улучшение опыта разработчиков
- Включите режим совместимости с помощью featureLevel
- Очистка характеристик экспериментальной подгруппы
- Устаревшее ограничение maxInterStageShaderComponents
- Утренние обновления
Хром 132
- Использование текстурного представления
- смешивание 32-битных текстур с плавающей запятой
- Атрибут GPUDevice adapterInfo
- Настройка контекста холста с недопустимым форматом вызывает ошибку JavaScript.
- Фильтрация ограничений сэмплера для текстур
- Эксперименты с расширенными подгруппами
- Улучшение опыта разработчиков
- Экспериментальная поддержка 16-битных нормализованных форматов текстур.
- Утренние обновления
Хром 131
- Расстояние между клипами в WGSL
- GPUCanvasContext getConfiguration()
- Примитивы точек и линий не должны иметь смещения по глубине.
- Встроенные функции сканирования для подгрупп.
- Экспериментальная поддержка непрямого режима с несколькими вариантами отсчета.
- Параметр компиляции модуля шейдера: строгая математика
- Удалить GPUAdapter requestAdapterInfo()
- Утренние обновления
Хром 130
- Смешивание из двух источников
- Улучшения времени компиляции шейдеров в Metal.
- Функция requestAdapterInfo() объявлена устаревшей.
- Утренние обновления
Хром 129
- Поддержка HDR с режимом тонального отображения холста.
- Расширенная поддержка подгрупп
- Утренние обновления
Хром 128
- Экспериментирование с подгруппами
- Устаревшая настройка смещения глубины для линий и точек.
- Скрыть предупреждение DevTools о незафиксированной ошибке, если используется preventDefault.
- WGSL сначала интерполирует выборку, а затем либо
- Утренние обновления
Хром 127
- Экспериментальная поддержка OpenGL ES на Android
- Информационный атрибут GPUAdapter
- Улучшения взаимодействия с WebAssembly
- Улучшена обработка ошибок кодировщика команд.
- Утренние обновления
Хром 126
- Увеличьте лимит maxTextureArrayLayers.
- Оптимизация загрузки буфера для бэкенда Vulkan.
- Улучшения времени компиляции шейдеров
- Буферы отправленных команд должны быть уникальными.
- Утренние обновления
Хром 125
Хром 124
- Текстуры для хранения данных только для чтения и для чтения и записи
- Поддержка работников сферы услуг и работников, работающих по совместительству
- Новые атрибуты информации об адаптере
- Исправлены ошибки
- Утренние обновления
Хром 123
- Поддержка встроенных функций DP4a в WGSL
- Неограниченные параметры указателей в WGSL
- Синтаксический сахар для разыменования составных элементов в WGSL
- Отдельное состояние только для чтения для параметров трафарета и глубины.
- Утренние обновления
Хром 122
- Расширьте охват аудитории с помощью режима совместимости (функция находится в разработке).
- Увеличьте лимит maxVertexAttributes.
- Утренние обновления
Хром 121
- Поддержка WebGPU на Android
- Для компиляции шейдеров в Windows используйте DXC вместо FXC.
- Запросы по временным меткам в вычислительных и рендеринговых проходах
- Точки входа по умолчанию для модулей шейдеров
- Поддержка display-p3 в качестве цветового пространства GPUExternalTexture
- информация о кучах памяти
- Утренние обновления
Хром 120
- Поддержка 16-битных значений с плавающей запятой в WGSL
- Расширяйте границы возможного
- Изменения в состоянии глубины-шаблона
- Обновления информации об адаптере
- Квантование запросов по временным меткам
- Особенности весенней уборки
Хром 119
- Фильтруемые 32-битные текстуры с плавающей запятой
- unorm10-10-10-2 формат вершин
- формат текстуры rgb10a2uint
- Утренние обновления
Хром 118
- Поддержка HTMLImageElement и ImageData в
copyExternalImageToTexture() - Экспериментальная поддержка текстур для чтения и записи, а также для чтения и только для чтения.
- Утренние обновления
Хром 117
- Неустановленный буфер вершин
- Отключить группу привязки
- Отключение ошибок при создании асинхронного конвейера в случае потери устройства
- Обновления по созданию шейдерных модулей SPIR-V
- Улучшение опыта разработчиков
- Конвейеры кэширования с автоматически генерируемой структурой.
- Утренние обновления
Хром 116
- Интеграция с WebCodecs
-
requestDevice()объекта GPUAdapter возвращает сообщение о потере устройства. - Обеспечьте плавное воспроизведение видео, если вызывается
importExternalTexture() - Соответствие спецификации
- Улучшение опыта разработчиков
- Утренние обновления
Хром 115
- Поддерживаемые языковые расширения WGSL
- Экспериментальная поддержка Direct3D 11
- При подключении к сети переменного тока по умолчанию используется дискретная видеокарта.
- Улучшение опыта разработчиков
- Утренние обновления
Хром 114
- Оптимизировать JavaScript
- Метод getCurrentTexture() на неконфигурированном холсте вызывает ошибку InvalidStateError.
- Обновления WGSL
- Утренние обновления