GPURenderBundleEncoder: метод drawIndexedIndirect()
Ограниченная доступность
Эта функция не относится к Baseline, так как она не работает в некоторых из наиболее широко используемых браузеров.
Экспериментальная: Это экспериментальная технология
Перед использованием в продакшене внимательно проверьте таблицу совместимости с браузерами.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод drawIndexedIndirect() интерфейса GPURenderBundleEncoder рисует индексированные примитивы, используя параметры, считываемые из GPUBuffer.
Примечание: Этот метод функционально идентичен своему эквиваленту в GPURenderPassEncoder — drawIndexedIndirect().
Синтаксис
drawIndexedIndirect(indirectBuffer, indirectOffset)
Параметры
indirectBuffer-
GPUBuffer, содержащийindexCount,instanceCount,firstIndex,baseVertex, иfirstInstanceзначения, необходимые для выполнения операции рисования. Буфер должен содержать плотный блок из пяти 32-битных беззнаковых целых чисел, представляющих значения (всего 20 байт), в том же порядке, что и аргументы дляGPURenderBundleEncoder.drawIndexed(). Например:const uint32 = new Uint32Array(5); uint32[0] = 3; // The indexCount value uint32[1] = 1; // The instanceCount value uint32[2] = 0; // The firstIndex value uint32[3] = 0; // The baseVertex value uint32[4] = 0; // The firstInstance value // Write values into a GPUBuffer device.queue.writeBuffer(buffer, 0, uint32, 0, uint32.length);
Примечание: Для использования ненулевых значений
firstInstanceнеобходимо включитьindirect-first-instanceфункцию. Если функцияindirect-first-instanceне включена, иfirstInstanceне равно нулю, вызовdrawIndexedIndirect()будет обработан как пустое действие. indirectOffset-
Смещение в байтах внутри
indirectBuffer, где начинаются данные значений.
Возвращаемое значение
None (Undefined).
Проверка
При вызове drawIndirect() должны быть выполнены следующие критерии, в противном случае генерируется GPUValidationError, и GPURenderBundleEncoder становится недействительным:
-
indirectBuffer'sGPUBuffer.usageсодержит флагGPUBufferUsage.INDIRECT. -
indirectOffset+ общий размер, указанный параметрами значений вindirectBuffer, меньше или равенindirectBuffer'sGPUBuffer.size. -
indirectOffsetкратно 4.
Примеры
// ...
// Create GPURenderBundleEncoder
const bundleEncoder = device.createRenderBundleEncoder(descriptor);
// Set pipeline and vertex buffer
bundleEncoder.setPipeline(renderPipeline);
bundleEncoder.setVertexBuffer(0, vertexBuffer);
bundleEncoder.setIndexBuffer(indexBuffer, "uint16");
// Create drawIndexedIndirect values
const uint32 = new Uint32Array(5);
uint32[0] = 3;
uint32[1] = 1;
uint32[2] = 0;
uint32[3] = 0;
uint32[4] = 0;
// Create a GPUBuffer and write the draw values into it
const drawValues = device.createBuffer({
size: 20,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(drawValues, 0, uint32, 0, uint32.length);
// Draw the vertices
bundleEncoder.drawIndexedIndirect(drawValues, 0);
// End the bundle recording
const renderBundle = bundleEncoder.finish();
// ...
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
drawIndexedIndirect |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
previewВ настоящее время поддерживается только на Linux и Windows. |
99В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
preview | 121 | Нет | 81 | Нет | 25.0 | 121 |
См. также
- 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/GPURenderBundleEncoder/drawIndexedIndirect