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: 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 GPURenderBundleEncoder-Schnittstelle setzt die GPUBindGroup, die für nachfolgende Render-Bundle-Befehle für einen gegebenen 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 Bind-Group gesetzt werden soll. 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 Render-Bundle-Befehle verwendet werden soll, oder null, wobei jede zuvor gesetzte Bind-Group im angegebenen Slot aufgehoben wird.

dynamicOffsets Optional

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

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

Wenn ein Uint32Array-Wert für dynamicOffsets angegeben ist, sind die folgenden zwei 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 aus dynamicOffsetsData gelesen werden sollen.

Rückgabewert

Keiner (undefined).

Ausnahmen

Für setBindGroup()-Aufrufe, die einen Uint32Array-Wert für dynamicOffsets verwenden, wird ein RangeError DOMException ausgelöst, 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 GPURenderBundleEncoder wird ungültig:

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

Beispiele

Bind-Group 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-Beispiel Animometer example.

Bind-Group aufheben

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