GPUDevice: createRenderPipelineAsync() 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 vor der Verwendung auf produktiven Webseiten.

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 createRenderPipelineAsync() Methode des GPUDevice Interfaces gibt ein Promise zurück, das mit einer GPURenderPipeline erfüllt wird. Diese kann die Vertex- und Fragment-Shader-Stufen steuern und in einem GPURenderPassEncoder oder GPURenderBundleEncoder verwendet werden, sobald die Pipeline ohne Stauungen verwendet werden kann.

Hinweis: Es ist in der Regel vorzuziehen, diese Methode gegenüber GPUDevice.createRenderPipeline() zu verwenden, wann immer es möglich ist, da sie das Blockieren der Ausführung von GPU-Operationen bei der Pipeline-Kompilierung verhindert.

Syntax

js
createRenderPipelineAsync(descriptor)

Parameter

descriptor

Siehe die Descriptor-Definition für die Methode GPUDevice.createRenderPipeline().

Rückgabewert

Ein Promise, das mit einer GPURenderPipeline Objektinstanz erfüllt wird, wenn die erstellte Pipeline bereit ist, ohne zusätzliche Verzögerung verwendet zu werden.

Validierung

Wenn die Erstellung der Pipeline fehlschlägt und die resultierende Pipeline dadurch ungültig wird, wird das zurückgegebene Promise mit einem GPUPipelineError abgelehnt:

  • Wenn dies aufgrund eines internen Fehlers geschieht, hat der GPUPipelineError einen reason von "internal".
  • Wenn dies aufgrund eines Validierungsfehlers geschieht, hat der GPUPipelineError einen reason von "validation".

Ein Validierungsfehler kann auftreten, wenn eines der folgenden Kriterien nicht erfüllt ist:

  • Für depthStencil Objekte:
    • format ist ein depth-or-stencil Format.
    • Die Eigenschaften depthBias, depthBiasClamp und depthBiasSlopeScale sind auf 0 für Linien- und Punkt-Topologien gesetzt, d.h. wenn topology auf "line-list", "line-strip" oder "point-list" eingestellt ist.
    • Wenn depthWriteEnabled true ist oder depthCompare nicht "always" ist, hat format eine Tiefenkomponente.
    • Wenn die Eigenschaften von stencilFront oder stencilBack nicht auf ihren Standardwerten sind, hat format eine Stencil-Komponente.
  • Für fragment Objekte:
    • targets.length ist kleiner oder gleich dem Limit der maxColorAttachments des GPUDevice.
    • Für jedes target ist das numerische Äquivalent von writeMask kleiner als 16.
    • Wenn eine der verwendeten Blend-Faktor-Operationen den Quellen-Alpha-Kanal verwenden (zum Beispiel "src-alpha-saturated"), hat der Output einen Alpha-Kanal (d.h. es muss ein vec4 sein).
    • Wenn die entryPoint Eigenschaft weggelassen wird, enthält der Shader-Code eine einzelne Fragment-Shader-Einstiegspunktfunktion, die der Browser als Standard-Einstiegspunkt verwenden kann.
  • Für primitive Objekte:
    • Wenn die unclippedDepth Eigenschaft verwendet wird, ist das depth-clip-control Feature aktiviert.
  • Für vertex Objekte:
    • Wenn die entryPoint Eigenschaft weggelassen wird, enthält der Shader-Code eine einzelne Vertex-Shader-Einstiegspunktfunktion, die der Browser als Standard-Einstiegspunkt verwenden kann.

Beispiele

Hinweis: Die WebGPU Beispiele enthalten viele weitere Beispiele.

Einfaches Beispiel

Das folgende Beispiel zeigt ein einfaches Beispiel der Konstruktion eines gültigen Render-Pipeline-Descriptor-Objekts, das dann verwendet wird, um eine GPURenderPipeline über einen createRenderPipelineAsync() Aufruf zu erstellen.

js
async function init() {
  // …

  const vertexBuffers = [
    {
      attributes: [
        {
          shaderLocation: 0, // position
          offset: 0,
          format: "float32x4",
        },
        {
          shaderLocation: 1, // color
          offset: 16,
          format: "float32x4",
        },
      ],
      arrayStride: 32,
      stepMode: "vertex",
    },
  ];

  const pipelineDescriptor = {
    vertex: {
      module: shaderModule,
      entryPoint: "vertex_main",
      buffers: vertexBuffers,
    },
    fragment: {
      module: shaderModule,
      entryPoint: "fragment_main",
      targets: [
        {
          format: navigator.gpu.getPreferredCanvasFormat(),
        },
      ],
    },
    primitive: {
      topology: "triangle-list",
    },
    layout: "auto",
  };

  const renderPipeline =
    await device.createRenderPipelineAsync(pipelineDescriptor);

  // …
}

Spezifikationen

Specification
WebGPU
# dom-gpudevice-createrenderpipelineasync

Browser-Kompatibilität

Siehe auch