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, 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 createRenderPipelineAsync() Methode der GPUDevice-Schnittstelle gibt ein Promise zurück, das mit einem 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 Verzögerungen genutzt werden kann.

Hinweis: Es ist allgemein vorzuziehen, diese Methode über GPUDevice.createRenderPipeline() zu verwenden, wann immer möglich, da sie die Blockierung der GPU-Betriebsausführung bei der Pipeline-Kompilierung verhindert.

Syntax

js
createRenderPipelineAsync(descriptor)

Parameter

descriptor

Siehe die Beschreibung des Deskriptors 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 genutzt zu werden.

Validierung

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

  • Bei einem internen Fehler wird der GPUPipelineError einen reason von "internal" haben.
  • Bei einem Validierungsfehler wird der GPUPipelineError einen reason von "validation" haben.

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 für Linien- und Punkt-Topologien auf 0 gesetzt, d.h., wenn topology auf "line-list", "line-strip" oder "point-list" gesetzt 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 maxColorAttachments Limit des GPUDevice.
    • Für jedes target ist das numerische Äquivalent von writeMask kleiner als 16.
    • Wenn irgendeine der verwendeten Blend-Faktor-Operationen den Quell-Alpha-Kanal nutzt (zum Beispiel "src-alpha-saturated"), muss das Ergebnis einen Alpha-Kanal haben (das heißt, es muss ein vec4 sein).

Beispiele

Hinweis: Die WebGPU-Proben enthalten viele weitere Beispiele.

Einfaches Beispiel

Das folgende Beispiel zeigt ein einfaches Beispiel für die Konstruktion eines gültigen Render-Pipeline-Beschreibungsobjekts, 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

BCD tables only load in the browser

Siehe auch