GPURenderBundleEncoder: setBindGroup() Methode

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig, bevor Sie diese produktiv verwenden.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Hinweis: Dieses Feature ist verfügbar in Web Workers.

Die setBindGroup()-Methode der GPURenderBundleEncoder-Schnittstelle setzt die GPUBindGroup, die für nachfolgende Render-Bundle-Befehle bei einem bestimmten Index verwendet werden soll.

Hinweis: Diese Methode ist funktional identisch mit ihrem Äquivalent auf GPURenderPassEncodersetBindGroup().

Syntax

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

Parameter

index

Der Index, an dem die Bindegruppe gesetzt 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 GPUBindGroup, die für nachfolgende Render-Bundle-Befehle verwendet wird, oder null, in diesem Fall wird eine zuvor gesetzte Bindegruppe in dem angegebenen Slot gelöscht.

dynamicOffsets Optional

Ein Wert, der den Versatz in Bytes für jeden Eintrag in bindGroup mit hasDynamicOffset: true angibt (d. h. in der Beschreibung des Aufrufs GPUDevice.createBindGroupLayout(), der das GPUBindGroupLayout-Objekt erstellt hat, auf dem die bindGroup basiert). Dieser Wert kann sein:

  • Ein Array von Zahlen, das die unterschiedlichen Versätze angibt.
  • Ein Uint32Array, das Zahlen enthält, die die Versätze angeben.

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

dynamicOffsetsStart

Eine Zahl, die den Versatz in Array-Elementen in dynamicOffsetsData angibt, wo die dynamischen Versatzdaten beginnen.

dynamicOffsetsLength

Eine Zahl, die die Anzahl der dynamischen Versatzwerte angibt, die in dynamicOffsetsData gelesen werden sollen.

Rückgabewert

Keiner (Undefined).

Ausnahmen

Für setBindGroup()-Aufrufe, 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 beim Aufruf von setBindGroup() erfüllt sein, ansonsten wird ein GPUValidationError erzeugt und der GPURenderBundleEncoder wird ungültig:

  • index ist kleiner oder gleich dem vom GPUDevice festgelegten maxBindGroups-Limit Grenzwert.
  • dynamicOffsets.length entspricht der Anzahl der Einträge in bindGroup mit hasDynamicOffset: true gesetzt.
  • Für bindGroup-Einträge, bei denen der gebundene buffer-Typ "uniform" ist (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des vom GPUDevice festgelegten minUniformBufferOffsetAlignment-Limits Grenzwert.
  • Für bindGroup-Einträge, bei denen der gebundene buffer-Typ "storage" oder "read-only-storage" ist (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des vom GPUDevice festgelegten minStorageBufferOffsetAlignment-Limits Grenzwert.
  • Für jeden bindGroup-Eintrag ist der gebundene buffer-Versatz plus der entsprechende Layout-EintragsminBindingSize, plus der entsprechende dynamische Versatz, der in dynamicOffsets angegeben ist, kleiner oder gleich der gebundenen buffer-Größe.

Beispiele

Bind-Gruppe setzen

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 WebGPU-Samples Animometer-Beispiel.

Bind-Gruppe aufheben

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

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

Spezifikationen

Specification
WebGPU
# programmable-passes-bind-groups

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch