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.

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 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