GPURenderBundleEncoder: метод drawIndirect()
Ограниченная доступность
Эта функция не является базовой, так как она не работает в некоторых из наиболее широко используемых браузеров.
Экспериментально: Это экспериментальная технология
Перед использованием в производственной среде тщательно проверьте таблицу совместимости браузеров таблица совместимости браузеров.
Безопасный контекст: Данная функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах. поддерживающие браузеры.
Примечание: Данная функция доступна в Web Workers.
Метод drawIndirect() интерфейса GPURenderBundleEncoder отрисовывает примитивы, используя параметры, считываемые из GPUBuffer.
Примечание: Этот метод функционально идентичен своему эквиваленту в GPURenderPassEncoder — drawIndirect().
Синтаксис
drawIndirect(indirectBuffer, indirectOffset)
Параметры
indirectBuffer-
GPUBufferсодержащий значенияvertexCount,instanceCount,firstVertex, иfirstInstance, необходимые для выполнения операции отрисовки. Буфер должен содержать плотный блок из четырех 32-битных беззнаковых целых значений, представляющих значения (16 байт в целом), в том же порядке, что и аргументы дляGPURenderBundleEncoder.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);
Примечание: Для использования ненулевых значений
firstInstanceнеобходимо включить функциюindirect-first-instance. Если функцияindirect-first-instanceне включена, аfirstInstanceне равно нулю, вызовdrawIndirect()будет обработан как нетранслируемая операция. indirectOffset-
Смещение в байтах внутри
indirectBuffer, где начинаются данные значений.
Возвращаемое значение
None (Undefined).
Проверка
При вызове drawIndirect() должны быть выполнены следующие условия, в противном случае будет сгенерирована ошибка GPUValidationError, и GPURenderBundleEncoder станет недопустимым:
-
indirectBufferсодержит флагGPUBufferUsage.INDIRECTвGPUBuffer.usage. -
indirectOffset+ суммарный размер, указанный параметрами значения вindirectBuffer, меньше или равенindirectBufferGPUBuffer.size. -
indirectOffsetкратно 4.
Примеры
// ...
// Create GPURenderBundleEncoder
const bundleEncoder = device.createRenderBundleEncoder(descriptor);
// Set pipeline and vertex buffer
bundleEncoder.setPipeline(renderPipeline);
bundleEncoder.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
bundleEncoder.drawIndirect(drawValues, 0);
// End the bundle recording
const renderBundle = bundleEncoder.finish();
// ...
Спецификации
| Спецификация |
|---|
| WebGPU # dom-gpurendercommandsmixin-drawindirect |
Совместимость браузеров
| Десктопные | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
drawIndirect |
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/drawIndirect