Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

GPURenderPassEncoder: setBindGroup()-Methode

Eingeschränkt verfügbar

Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.

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 GPURenderPassEncoder-Schnittstelle legt die GPUBindGroup fest, die für nachfolgende Render-Befehle bei einem gegebenen Index verwendet wird.

Syntax

js
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
             dynamicOffsetsLength)

Parameter

index

Der Index, bei dem die Bindgruppe festgelegt wird. Dieser entspricht dem n-Indexwert des entsprechenden @group(n)-Attributs im Shader-Code (GPUShaderModule), der in der zugehörigen Pipeline verwendet wird.

bindGroup

Die zu verwendende GPUBindGroup für nachfolgende Render-Befehle oder null, wobei jede zuvor festgelegte Bindgruppe im gegebenen Slot aufgehoben wird.

dynamicOffsets Optional

Ein Wert, der den Offset in Bytes für jeden Eintrag in bindGroup angibt, bei dem hasDynamicOffset: true gesetzt ist (d.h. im Deskriptor des Aufrufs von GPUDevice.createBindGroupLayout(), der das GPUBindGroupLayout-Objekt erstellt hat, auf dem die bindGroup basiert). Dieser Wert kann sein:

  • Ein Array von Zahlen, das die verschiedenen Offsets angibt.
  • Ein Uint32Array, das Zahlen enthält, die die Offsets angeben.

Wenn ein Uint32Array-Wert für dynamicOffsets angegeben ist, sind beide der folgenden Parameter ebenfalls erforderlich:

dynamicOffsetsStart

Eine Zahl, die den Offset in Array-Elementen in dynamicOffsetsData angibt, wo die dynamischen Offset-Daten beginnen.

dynamicOffsetsLength

Eine Zahl, die die Anzahl der dynamischen Offset-Werte angibt, die in dynamicOffsetsData gelesen werden sollen.

Rückgabewert

Keiner (undefined).

Ausnahmen

Bei setBindGroup()-Aufrufen, die einen Uint32Array-Wert für dynamicOffsets verwenden, wird der Aufruf mit einem RangeError-DOMException fehlschlagen, wenn:

  • dynamicOffsetsStart kleiner als 0 ist.
  • dynamicOffsetsStart + dynamicOffsetsLength größer als dynamicOffsets.length ist.

Validierung

Die folgenden Kriterien müssen erfüllt sein, wenn setBindGroup() aufgerufen wird, andernfalls wird ein GPUValidationError erzeugt und der GPURenderPassEncoder wird ungültig:

  • index ist kleiner oder gleich dem maxBindGroups- Limit des GPUDevice.
  • dynamicOffsets.length entspricht der Anzahl der Einträge in bindGroup mit hasDynamicOffset: true gesetzt.
  • Bei bindGroup-Einträgen, bei denen der gebundene buffer-type "uniform" ist (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des minUniformBufferOffsetAlignment- Limits des GPUDevice.
  • Bei bindGroup-Einträgen, bei denen der gebundene buffer-type "storage" oder "read-only-storage" ist (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des minStorageBufferOffsetAlignment- Limits des GPUDevice.
  • Für jeden bindGroup-Eintrag ist der buffer-offset des gebundenen Buffers, plus die minBindingSize des entsprechenden Layout-Eintrags, plus der entsprechende dynamische Offset, der in dynamicOffsets angegeben ist, kleiner oder gleich der size des gebundenen Buffers.

Beispiele

Bindgruppe festlegen

Im WebGPU-Beispiel "Texturwürfel" (Textured Cube example) wird setBindGroup() verwendet, um die uniformBindGroup an der Indexposition 0 zu binden. Schauen Sie sich das Beispiel für den kompletten Kontext an.

js
// …

const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
passEncoder.setPipeline(pipeline);
passEncoder.setBindGroup(0, uniformBindGroup);
passEncoder.setVertexBuffer(0, verticesBuffer);
passEncoder.draw(cubeVertexCount, 1, 0, 0);
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);

// …

Hinweis: Untersuchen Sie die anderen WebGPU-Beispiele, um weitere Beispiele für die Verwendung von setBindGroup() zu finden.

Bindgruppe aufheben

js
// Set bind group in slot 0
passEncoder.setBindGroup(0, uniformBindGroup);

// Later, unset bind group in slot 0
passEncoder.setBindGroup(0, null);

Spezifikationen

Spezifikation
WebGPU
# programmable-passes-bind-groups

Browser-Kompatibilität

Siehe auch