GPUComputePassEncoder: setBindGroup()-Methode
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die setBindGroup()-Methode der GPUComputePassEncoder-Schnittstelle setzt die GPUBindGroup für nachfolgende Berechnungsbefehle für einen bestimmten Index.
Syntax
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
dynamicOffsetsLength)
Parameter
index-
Der Index, an dem die Bind-Gruppe gesetzt wird. Dies entspricht dem
n-Indexwert des entsprechenden@group(n)-Attributs im Shader-Code (GPUShaderModule), der in der zugehörigen Pipeline verwendet wird. bindGroup-
Die
GPUBindGroup, die für nachfolgende Compute-Befehle verwendet wird, odernull, in diesem Fall wird jede zuvor gesetzte Bind-Gruppe im angegebenen Slot aufgehoben. dynamicOffsetsOptional-
Ein Wert, der den Versatz in Bytes für jeden Eintrag in
bindGroupmithasDynamicOffset: trueangibt (d.h. in der Beschreibung des Aufrufs vonGPUDevice.createBindGroupLayout(), der dasGPUBindGroupLayout-Objekt erstellt hat, auf dembindGroupbasiert). Dieser Wert kann sein:- Ein Array von Zahlen, das die verschiedenen Versätze angibt.
- Ein
Uint32Array, das Zahlen enthält, die die Versätze angeben.
Wenn ein Uint32Array-Wert für dynamicOffsets angegeben wird, sind beide der folgenden Parameter ebenfalls erforderlich:
dynamicOffsetsStart-
Eine Zahl, die den Versatz in Array-Elementen in
dynamicOffsetsDataangibt, wo die dynamischen Versatzdaten beginnen. dynamicOffsetsLength-
Eine Zahl, die die Anzahl der dynamischen Versatzwerte angibt, die in
dynamicOffsetsDatagelesen werden sollen.
Rückgabewert
Keiner (Undefined).
Ausnahmen
Bei setBindGroup()-Aufrufen, die einen Uint32Array-Wert für dynamicOffsets verwenden, wird der Aufruf mit einem RangeErrorDOMException ausgelöst, wenn:
dynamicOffsetsStartkleiner als 0 ist.dynamicOffsetsStart+dynamicOffsetsLengthgrößer alsdynamicOffsets.lengthist.
Validierung
Die folgenden Kriterien müssen erfüllt sein, wenn dispatchWorkgroups() aufgerufen wird, andernfalls wird ein GPUValidationError erzeugt und der GPUComputePassEncoder wird ungültig:
indexist kleiner oder gleich dermaxBindGroups-Grenze desGPUDevice.dynamicOffsets.lengthentspricht der Anzahl der Einträge inbindGroupmithasDynamicOffset: true.- Für
bindGroup-Einträge, bei denen der gebundenebuffer-type"uniform"ist (sieheGPUDevice.createBindGroupLayout()), ist jede Zahl indynamicOffsetsein Vielfaches derminUniformBufferOffsetAlignment-Grenze desGPUDevice. - Für
bindGroup-Einträge, bei denen der gebundenebuffer-type"storage"oder"read-only-storage"ist (sieheGPUDevice.createBindGroupLayout()), ist jede Zahl indynamicOffsetsein Vielfaches derminStorageBufferOffsetAlignment-Grenze desGPUDevice. - Für jeden
bindGroup-Eintrag ist der gebundenebuffer-offset, plus dieminBindingSizedes entsprechenden Layout-Eintrags, plus der entsprechende dynamische Versatz, der indynamicOffsetsangegeben ist, kleiner oder gleich dersizedes gebundenenbuffer.
Beispiele
>Bind-Gruppe setzen
In unserem grundlegenden Compute-Demo werden mehrere Befehle über einen GPUCommandEncoder aufgezeichnet. Die meisten dieser Befehle stammen vom GPUComputePassEncoder, der durch beginComputePass() erstellt wurde. Der hier verwendete setBindGroup()-Aufruf ist die einfachste Form, bei der nur Index und Bind-Gruppe angegeben werden.
const BUFFER_SIZE = 1000;
// …
// Create GPUCommandEncoder to encode commands to issue to the GPU
const commandEncoder = device.createCommandEncoder();
// Initiate render pass
const passEncoder = commandEncoder.beginComputePass();
// Issue commands
passEncoder.setPipeline(computePipeline);
passEncoder.setBindGroup(0, bindGroup);
passEncoder.dispatchWorkgroups(Math.ceil(BUFFER_SIZE / 64));
// End the render pass
passEncoder.end();
// Copy output buffer to staging buffer
commandEncoder.copyBufferToBuffer(
output,
0, // Source offset
stagingBuffer,
0, // Destination offset
BUFFER_SIZE,
);
// End frame by passing array of command buffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);
// …
Bind-Gruppe aufheben
// Set bind group in slot 0
passEncoder.setBindGroup(0, bindGroup);
// Later, unset bind group in slot 0
passEncoder.setBindGroup(0, null);
Spezifikationen
| Specification |
|---|
| WebGPU> # programmable-passes-bind-groups> |
Browser-Kompatibilität
Loading…
Siehe auch
- Die WebGPU API