Spec-Zone.ru › Web APIs

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API