GPUDevice: метод createRenderBundleEncoder()
Ограниченная доступность
Эта функция не относится к базовым, так как не работает во всех широко используемых браузерах.
Экспериментальная функция: Это экспериментальная технология
Перед использованием в продакшене внимательно изучите таблицу совместимости с браузерами.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод createRenderBundleEncoder() интерфейса GPUDevice создаёт объект GPURenderBundleEncoder, который можно использовать для предварительной записи наборов команд. Эти наборы можно повторно использовать в объектах GPURenderPassEncoder с помощью метода executeBundles() любое количество раз.
Синтаксис
createRenderBundleEncoder(descriptor)
Параметры
descriptor-
Объект, содержащий следующие свойства:
colorFormats-
Массив перечислений, определяющих ожидаемые цветовые форматы для целей рендеринга. Возможные значения см. в
GPUTextureFormatопределении в спецификации. depthReadOnlyНеобязательно-
Булево значение. Если
true, указывает, что выполнение любогоGPURenderBundle, созданного объектомGPURenderBundleEncoder, не изменит компонент глубиныdepthStencilFormatпри выполнении. Если опущено,depthReadOnlyпо умолчанию будетfalse. depthStencilFormatНеобязательно-
Перечисление, определяющее ожидаемый формат глубины или трафарета для целей рендеринга. Возможные значения см. в разделе «Форматы глубины и трафарета» спецификации.
labelНеобязательно-
Строка, предоставляющая метку, которая может использоваться для идентификации объекта, например, в сообщениях
GPUErrorили предупреждениях консоли. sampleCountНеобязательно-
Число, представляющее ожидаемое количество сэмплов для целей рендеринга.
stencilReadOnlyНеобязательно-
Булево значение. Если
true, указывает, что выполнение любогоGPURenderBundle, созданного объектомGPURenderBundleEncoder, не изменит компонент трафаретаdepthStencilFormatпри выполнении. Если опущено,stencilReadOnlyпо умолчанию будетfalse.
Возвращаемое значение
Объект GPURenderBundleEncoder.
Примеры
В примере «Animometer» в WebGPU Samples пример Animometer много подобных операций выполняется одновременно на многих различных объектах. Набор команд кодируется с помощью следующей функции:
function recordRenderPass(
passEncoder: GPURenderBundleEncoder | GPURenderPassEncoder
) {
if (settings.dynamicOffsets) {
passEncoder.setPipeline(dynamicPipeline);
} else {
passEncoder.setPipeline(pipeline);
}
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.setBindGroup(0, timeBindGroup);
const dynamicOffsets = [0];
for (let i = 0; i < numTriangles; ++i) {
if (settings.dynamicOffsets) {
dynamicOffsets[0] = i * alignedUniformBytes;
passEncoder.setBindGroup(1, dynamicBindGroup, dynamicOffsets);
} else {
passEncoder.setBindGroup(1, bindGroups[i]);
}
passEncoder.draw(3, 1, 0, 0);
}
}
Позже объект GPURenderBundleEncoder создаётся с помощью createRenderBundleEncoder(), вызывается функция, и набор команд записывается в объект GPURenderBundle с помощью GPURenderBundleEncoder.finish():
const renderBundleEncoder = device.createRenderBundleEncoder({
colorFormats: [presentationFormat],
});
recordRenderPass(renderBundleEncoder);
const renderBundle = renderBundleEncoder.finish();
Затем используется GPURenderPassEncoder.executeBundles() для повторного использования работы в нескольких проходах рендеринга, чтобы улучшить производительность. Изучите пример кода для полного контекста.
// ...
return function doDraw(timestamp) {
if (startTime === undefined) {
startTime = timestamp;
}
uniformTime[0] = (timestamp - startTime) / 1000;
device.queue.writeBuffer(uniformBuffer, timeOffset, uniformTime.buffer);
renderPassDescriptor.colorAttachments[0].view = context
.getCurrentTexture()
.createView();
const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
if (settings.renderBundles) {
passEncoder.executeBundles([renderBundle]);
} else {
recordRenderPass(passEncoder);
}
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
};
// ...
Спецификации
| Спецификация |
|---|
| WebGPU # dom-gpudevice-createrenderbundleencoder |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
createRenderBundleEncoder |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
previewВ настоящее время поддерживается только на Linux и Windows. |
99В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
preview | 121 | Нет | 81 | Нет | 25.0 | 121 |
См. также
- The API WebGPU
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/GPUDevice/createRenderBundleEncoder