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

View in English Always switch to English

GPURenderBundleEncoder: 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() der Schnittstelle GPURenderBundleEncoder legt für einen bestimmten Index die GPUBindGroup fest, die für nachfolgende Render-Bundle-Befehle verwendet wird.

Hinweis: Diese Methode ist funktional identisch mit der entsprechenden Methode von GPURenderPassEncoder — setBindGroup().

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 betreffenden Pipeline verwendet wird.

bindGroup

Die GPUBindGroup, die für nachfolgende Render-Bundle-Befehle 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, bei dem hasDynamicOffset: true festgelegt ist, den Offset in Byte angibt (also im Deskriptor des Aufrufs von GPUDevice.createBindGroupLayout(), mit dem das GPUBindGroupLayout-Objekt 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, an 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 sollen.

Rückgabewert

Keiner (undefined).

Ausnahmen

Bei Aufrufen von setBindGroup(), die für dynamicOffsets ein Uint32Array verwenden, wird ein RangeError ausgelöst, wenn:

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

Validierung

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

  • index ist kleiner oder gleich dem Limit maxBindGroups des GPUDevice.
  • dynamicOffsets.length entspricht der Anzahl der Einträge in bindGroup, bei denen hasDynamicOffset: true festgelegt ist.
  • Bei bindGroup-Einträgen, deren gebundener buffer den type "uniform" hat (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des Limits minUniformBufferOffsetAlignment des GPUDevice.
  • Bei bindGroup-Einträgen, 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 bindGroup-Eintrag ist die Summe aus dem offset des gebundenen buffer, dem minBindingSize des entsprechenden Layout-Eintrags und dem zugehörigen, in dynamicOffsets angegebenen dynamischen Offset kleiner oder gleich der size des gebundenen buffer.

Beispiele

Bind Group festlegen

js
function recordRenderPass(passEncoder) {
  if (settings.dynamicOffsets) {
    passEncoder.setPipeline(dynamicPipeline);
  } else {
    passEncoder.setPipeline(pipeline);
  }
  passEncoder.setVertexBuffer(0, vertexBuffer);
  passEncoder.setBindGroup(0, timeBindGroup);
  const dynamicOffsets = [0];
  for (let i = 0; i < numTriangles; ++i) {
    if (settings.dynamicOffsets) {
      dynamicOffsets[0] = i * alignedUniformBytes;
      passEncoder.setBindGroup(1, dynamicBindGroup, dynamicOffsets);
    } else {
      passEncoder.setBindGroup(1, bindGroups[i]);
    }
    passEncoder.draw(3, 1, 0, 0);
  }
}

Der obige Ausschnitt stammt aus dem Animometer-Beispiel der WebGPU Samples.

Bind Group entfernen

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

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

Spezifikationen

Spezifikation
WebGPU
# programmable-passes-bind-groups

Browser-Kompatibilität

Siehe auch