Расстояния отсечения в 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, как показано в примере «Частицы (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
активных вызовов в подгруппе. -
subgroupInclusiveMul(value)
: возвращает умножение инклюзивного сканирования всехvalue
активных вызовов в подгруппе.
Экспериментальная поддержка косвенного множественного отрисовки
Функция косвенного графического процессора с несколькими отрисовками позволяет выполнять несколько вызовов отрисовки с помощью одной команды графического процессора. Это особенно полезно в ситуациях, когда необходимо визуализировать большое количество объектов, таких как системы частиц, создание экземпляров и большие сцены. Методы drawIndirect()
и drawIndexedIndirect()
GPURenderPassEncoder могут одновременно выдавать только один вызов отрисовки из определенной области буфера графического процессора.
Пока эта экспериментальная функция не будет стандартизирована , включите флаг «Поддержка Unsafe 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» на странице 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 });
Удалить запрос GPUAdapterAdapterInfo()
Асинхронный метод GPUAdapter requestAdapterInfo()
является избыточным, поскольку вы уже можете получить GPUAdapterInfo синхронно, используя атрибут info
GPUAdapter. Следовательно, нестандартный метод GPUAdapter requestAdapterInfo()
теперь удален. См. намерение удалить .
Обновления рассвета
Исполняемый файл tint_benchmark
измеряет стоимость перевода шейдеров из WGSL на каждый серверный язык. Ознакомьтесь с новой документацией , чтобы узнать о ней больше.
Это касается только некоторых ключевых моментов. Ознакомьтесь с исчерпывающим списком коммитов .
Что нового в WebGPU
Список всего, что было описано в серии «Что нового в WebGPU» .
Хром 131
- Расстояния отсечения в WGSL
- GPUCanvasContext getConfiguration()
- Примитивы точек и линий не должны иметь смещения глубины.
- Встроенные функции инклюзивного сканирования для подгрупп
- Экспериментальная поддержка косвенного множественного отрисовки
- Вариант компиляции шейдерного модуля, строгая математика
- Удалить запрос GPUAdapterAdapterInfo()
- Обновления рассвета
Хром 130
- Смешение двух источников
- Улучшение времени компиляции шейдеров в Metal
- Устаревшая функция запроса GPUAdapterInfo().
- Обновления рассвета
Хром 129
Хром 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
- Используйте DXC вместо FXC для компиляции шейдеров в Windows.
- Запросы меток времени в проходах вычислений и рендеринга
- Точки входа по умолчанию в шейдерные модули
- Поддержка display-p3 как цветового пространства GPUExternalTexture.
- Информация о кучах памяти
- Обновления рассвета
Хром 120
- Поддержка 16-битных значений с плавающей запятой в WGSL.
- Расширьте границы
- Изменения состояния трафарета глубины
- Обновления информации об адаптере
- Квантование запросов временных меток
- Особенности генеральной уборки
Хром 119
- Фильтруемые 32-битные текстуры с плавающей запятой.
- формат вершин unorm10-10-10-2
- формат текстур rgb10a2uint
- Обновления рассвета
Хром 118
- Поддержка HTMLImageElement и ImageData в
copyExternalImageToTexture()
- Экспериментальная поддержка текстур для чтения-записи и хранения только для чтения.
- Обновления рассвета
Хром 117
- Сбросить буфер вершин
- Сбросить группу привязки
- Ошибки молчания при создании асинхронного конвейера при потере устройства
- Обновления создания шейдерного модуля SPIR-V
- Улучшение опыта разработчиков
- Кэширование конвейеров с автоматически создаваемым макетом
- Обновления рассвета
Хром 116
- Интеграция веб-кодеков
- Потерянное устройство, возвращенное
requestDevice()
- Обеспечьте плавное воспроизведение видео, если вызывается
importExternalTexture()
- Соответствие спецификациям
- Улучшение опыта разработчиков
- Обновления рассвета
Хром 115
- Поддерживаемые языковые расширения WGSL
- Экспериментальная поддержка Direct3D 11
- Получите дискретный графический процессор по умолчанию от сети переменного тока
- Улучшение опыта разработчиков
- Обновления рассвета
Хром 114
- Оптимизировать JavaScript
- getCurrentTexture() на ненастроенном холсте выдает InvalidStateError
- Обновления WGSL
- Обновления рассвета