GPURenderPassEncoder: метод drawIndirect()
Ограниченная доступность
Эта функция не является базовой, так как она не работает в некоторых из наиболее широко используемых браузеров.
Экспериментально: Это экспериментальная технология
Перед использованием в продакшене внимательно проверьте таблицу совместимости с браузерами.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в рабочих потоках.
Метод drawIndirect() интерфейса GPURenderPassEncoder рисует примитивы, используя параметры, считанные из GPUBuffer.
Синтаксис
drawIndirect(indirectBuffer, indirectOffset)
Параметры
indirectBuffer-
GPUBuffer, содержащийvertexCount,instanceCount,firstVertex, иfirstInstanceзначения, необходимые для выполнения операции рисования. Буфер должен содержать плотный блок из четырёх 32-битных беззнаковых целых значений, представляющих значения (всего 16 байт), в том же порядке, что и аргументы дляGPURenderPassEncoder.draw(). Например:const uint32 = new Uint32Array(4); uint32[0] = 3; // The vertexCount value uint32[1] = 1; // The instanceCount value uint32[2] = 0; // The firstVertex value uint32[3] = 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не равно нулю, вызовdrawIndirect()будет обрабатываться как бездействующий. indirectOffset-
Смещение в байтах в
indirectBuffer, где начинаются данные значений.
Возвращаемое значение
None (Undefined).
Валидация
При вызове drawIndirect() должны быть выполнены следующие критерии, в противном случае генерируется GPUValidationError, и GPURenderPassEncoder становится недействительным:
-
indirectBuffer'sGPUBuffer.usageсодержит флагGPUBufferUsage.INDIRECT. -
indirectOffset+ общий размер, указанный параметрами значений вindirectBuffer, не превышаетindirectBuffer'sGPUBuffer.size. -
indirectOffsetкратно 4.
Примеры
// ...
// Create GPURenderPassEncoder
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
// Set pipeline and vertex buffer
passEncoder.setPipeline(renderPipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
// Create drawIndirect values
const uint32 = new Uint32Array(4);
uint32[0] = 3;
uint32[1] = 1;
uint32[2] = 0;
uint32[3] = 0;
// Create a GPUBuffer and write the draw values into it
const drawValues = device.createBuffer({
size: 16,
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.INDIRECT,
});
device.queue.writeBuffer(drawValues, 0, uint32, 0, uint32.length);
// Draw the vertices
passEncoder.drawIndirect(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()]);
// ...
Спецификации
| Спецификация |
|---|
| WebGPU # dom-gpurendercommandsmixin-drawindirect |
Совместимость с браузерами
| Рабочие столы | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
drawIndirect |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
113В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
предварительная версияВ настоящее время поддерживается только на Linux и Windows. |
99В настоящее время поддерживается только на ChromeOS, macOS и Windows. |
предварительная версия | 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/drawIndirect