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: Methode setBindGroup()

Eingeschränkt verfügbar

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

Want more browser support for this feature? Tell us why.

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 Methode setBindGroup() des Interfaces GPURenderPassEncoder legt die GPUBindGroup fest, die für nachfolgende Renderbefehle an einem bestimmten Index verwendet wird.

Syntax

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

Parameter

index

Der Index, an dem die Bind Group festgelegt wird. Er entspricht dem Indexwert n des zugehörigen Attributs @group(n) im Shader-Code (GPUShaderModule), der in der zugehörigen Pipeline verwendet wird.

bindGroup

Die GPUBindGroup, die für nachfolgende Renderbefehle verwendet wird, oder null. Bei null wird eine zuvor im angegebenen Slot festgelegte Bind Group entfernt.

dynamicOffsets Optional

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

  • Ein Array von Zahlen, die die verschiedenen Offsets angeben.
  • Ein Uint32Array mit Zahlen, die die Offsets angeben.

Wenn für dynamicOffsets ein Uint32Array angegeben wird, sind zusätzlich beide folgenden Parameter erforderlich:

dynamicOffsetsStart

Eine Zahl, die den Offset in Array-Elementen innerhalb von dynamicOffsetsData angibt, ab dem die Daten für die dynamischen Offsets beginnen.

dynamicOffsetsLength

Eine Zahl, die angibt, wie viele Werte für dynamische Offsets aus dynamicOffsetsData gelesen werden.

Rückgabewert

Keiner (undefined).

Ausnahmen

Wenn bei einem Aufruf von setBindGroup() für dynamicOffsets ein Uint32Array verwendet wird, löst der Aufruf in folgenden Fällen einen RangeError aus:

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

Validierung

Beim Aufruf von setBindGroup() müssen die folgenden Bedingungen erfüllt sein. Andernfalls wird ein GPUValidationError erzeugt und der GPURenderPassEncoder wird ungültig:

  • index ist kleiner oder gleich dem Limit maxBindGroups des GPUDevice.
  • dynamicOffsets.length entspricht der Anzahl der Einträge in bindGroup, für die hasDynamicOffset: true gesetzt ist.
  • Bei Einträgen in bindGroup, deren gebundener buffer den type "uniform" hat (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des Limits minUniformBufferOffsetAlignment des GPUDevice.
  • Bei Einträgen in bindGroup, deren gebundener buffer den type "storage" oder "read-only-storage" hat (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des Limits minStorageBufferOffsetAlignment des GPUDevice.
  • Für jeden Eintrag in bindGroup ist die Summe aus dem offset des gebundenen buffer, dem minBindingSize des entsprechenden Layout-Eintrags und dem entsprechenden in dynamicOffsets angegebenen dynamischen Offset kleiner oder gleich der size des gebundenen buffer.

Beispiele

Bind Group festlegen

Im Beispiel „Textured Cube“ der WebGPU Samples wird setBindGroup() verwendet, um uniformBindGroup an Indexposition 0 zu binden. Den vollständigen Zusammenhang finden Sie im Beispiel.

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: Weitere Beispiele für die Verwendung von setBindGroup() finden Sie in den anderen WebGPU Samples.

Bind Group entfernen

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