GPURenderPassEncoder: метод drawIndexedIndirect()
Ограниченная доступность
Эта функция не относится к Baseline, так как она не работает в некоторых из наиболее широко используемых браузеров.
Экспериментально: Это экспериментальная технология.
Внимательно проверьте таблицу совместимости браузеров перед использованием в рабочей среде.
Контекст безопасности: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод drawIndexedIndirect() интерфейса GPURenderPassEncoder рисует индексированные примитивы, используя параметры, считываемые из GPUBuffer.
Синтаксис
drawIndexedIndirect(indirectBuffer, indirectOffset)
Параметры
indirectBuffer-
A
GPUBufferсодержащий значенияindexCount,instanceCount,firstIndex,baseVertex, иfirstInstance, необходимые для выполнения операции рисования. Буфер должен содержать плотно упакованный блок из пяти 32-битных беззнаковых целочисленных значений, представляющих значения (всего 20 байтов), в том же порядке, что и аргументы дляGPURenderPassEncoder.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);
Примечание: Функция
indirect-first-instanceфункция должна быть включена для использования значений отличных от нуляfirstInstance. Если функцияindirect-first-instanceне включена, аfirstInstanceне равно нулю, вызовdrawIndexedIndirect()будет обработан как нет действия. indirectOffset-
Смещение в байтах в
indirectBuffer, где начинаются данные значений.
Возвращаемое значение
None (Undefined).
Валидация
При вызове drawIndirect() должны быть выполнены следующие критерии, в противном случае генерируется GPUValidationError, и GPURenderPassEncoder становится недействительным:
-
indirectBuffer'sGPUBuffer.usageсодержит флагGPUBufferUsage.INDIRECT. -
indirectOffset+ общий размер, указанный параметрами значений вindirectBuffer, меньше или равенGPUBuffer.sizeindirectBuffer. -
indirectOffsetкратно 4.
Примеры
// ...
// Create GPURenderPassEncoder
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
// Set pipeline and vertex buffer
passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.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
passEncoder.drawIndexedIndirect(drawValues, 0);
// End the render pass
passEncoder.end();
// End frame by passing array of GPUCommandBuffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);
// ...
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для 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/GPURenderPassEncoder/drawIndexedIndirect