GPURenderBundleEncoder: setBindGroup() Methode

Limited availability

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

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 zur Verwendung für nachfolgende Befehle des Render-Bundles, für einen gegebenen Index.

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-Gruppe gesetzt wird. 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 Befehle des Render-Bundles verwendet wird, oder null, wobei jede zuvor gesetzte Bind-Gruppe im gegebenen Slot aufgehoben wird.

dynamicOffsets Optional

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

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

Wenn ein Uint32Array-Wert für dynamicOffsets angegeben wird, sind beide der folgenden Parameter ebenfalls erforderlich:

dynamicOffsetsStart

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

dynamicOffsetsLength

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

Rückgabewert

Keiner (Undefined).

Ausnahmen

Für setBindGroup()-Aufrufe, die einen Uint32Array-Wert für dynamicOffsets verwenden, wirft der Aufruf einen RangeError DOMException, 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 ist gleich 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 des minUniformBufferOffsetAlignment- Limits 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 des minStorageBufferOffsetAlignment- Limits des GPUDevice.
  • Für jeden bindGroup-Eintrag ist der gebundene buffer-offset plus die entsprechende Layout-Eintrags-minBindingSize plus der entsprechende in dynamicOffsets angegebene dynamische Offset kleiner oder gleich der size des gebundenen buffers.

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

Siehe auch