Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
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.
Die WebGPU API ermöglicht es Webentwicklern, die GPU (Graphics Processing Unit) des zugrunde liegenden Systems zu nutzen, um Hochleistungsberechnungen durchzuführen und komplexe Bilder zu zeichnen, die im Browser gerendert werden können.
WebGPU ist der Nachfolger von WebGL und bietet eine bessere Kompatibilität mit modernen GPUs, Unterstützung für allgemeine GPU-Berechnungen, schnellere Operationen und Zugriff auf umfassendere GPU-Funktionen.
Es ist fair zu sagen, dass WebGL das Web in Bezug auf grafische Fähigkeiten revolutioniert hat, nachdem es erstmals um 2011 erschienen ist. WebGL ist ein JavaScript-Port der Grafikbibliothek OpenGL ES 2.0, der es Webseiten ermöglicht, Renderberechnungen direkt an die GPU des Geräts zu übergeben, um diese mit sehr hoher Geschwindigkeit zu verarbeiten und das Ergebnis in ein <canvas>-Element zu rendern.
WebGL und die zum Schreiben von WebGL-Shader-Code verwendete Sprache GLSL sind komplex, weshalb mehrere WebGL-Bibliotheken erstellt wurden, um das Schreiben von WebGL-Anwendungen zu erleichtern: Beliebte Beispiele sind Three.js, Babylon.js und PlayCanvas. Entwickler haben diese Tools genutzt, um immersive webbasierte 3D-Spiele, Musikvideos, Schulungs- und Modellierungstools, VR- und AR-Erlebnisse und mehr zu erstellen.
WebGL hat jedoch einige grundlegende Probleme, die behoben werden mussten:
WebGPU geht auf diese Probleme ein und bietet eine aktualisierte, allgemeine Architektur, die mit modernen GPU-APIs kompatibel und "weborientierter" ist. Es unterstützt sowohl die grafische Darstellung als auch GPGPU-Berechnungen als erstklassige Funktionalität. Das Rendering einzelner Objekte ist auf der CPU-Seite erheblich günstiger, und es werden moderne GPU-Rendering-Funktionen unterstützt, wie partikelbasierte Rechnungen und Nachbearbeitungsfilter wie Farbeffekte, Schärfen und Tiefenschärfesimulation. Zudem kann es aufwändige Berechnungen wie Culling und Transformation von skinierten Modellen direkt auf der GPU durchführen.
Es gibt mehrere Abstraktionsebenen zwischen einem Geräte-GPU und einem Webbrowser, der die WebGPU API ausführt. Es ist nützlich, diese zu verstehen, wenn Sie beginnen, WebGPU zu lernen:
Physische Geräte verfügen über GPUs. Die meisten Geräte haben nur eine GPU, einige jedoch mehrere. Verschiedene GPU-Typen sind verfügbar:
Hinweis: Das obige Diagramm geht von einem Gerät mit nur einer GPU aus.
Eine native GPU-API, die Teil des Betriebssystems ist (zum Beispiel Metal auf macOS), ist eine Programmierschnittstelle, die es nativen Anwendungen ermöglicht, die Fähigkeiten der GPU zu nutzen. API-Befehle werden über einen Treiber an die GPU gesendet (und Antworten empfangen). Es ist möglich, dass ein System mehrere native OS-APIs und Treiber zur Kommunikation mit der GPU zur Verfügung hat, obwohl das obige Diagramm von einem Gerät mit nur einem nativen API/Treiber ausgeht.
Eine WebGPU-Implementierung des Browsers verarbeitet die Kommunikation mit der GPU über einen nativen GPU-API-Treiber. Ein WebGPU-Adapter repräsentiert in Ihrem Code effektiv eine physische GPU und einen Treiber, die im zugrunde liegenden System verfügbar sind.
Ein logisches Gerät ist eine Abstraktion, über die eine einzelne Web-App auf GPU-Funktionen auf compartmentalisierte Weise zugreifen kann. Logische Geräte müssen Multiplexfähigkeiten bereitstellen. Die GPU eines physischen Geräts wird von vielen Anwendungen und Prozessen gleichzeitig genutzt, möglicherweise auch von vielen Web-Apps. Jede Web-App muss aus Sicherheits- und Logikgründen in der Lage sein, isoliert auf WebGPU zuzugreifen.
Ein logisches Gerät — dargestellt durch eine GPUDevice-Objektinstanz — ist die Grundlage, von der aus eine Web-App auf alle WebGPU-Funktionen zugreift. Der Zugriff auf ein Gerät erfolgt wie folgt:
Zusammen mit einigen Funktionsüberprüfungen könnte der obige Prozess wie folgt erreicht werden:
Standardmäßig unterstützt ein GPUAdapter alle Core-WebGPU-Funktionen und -Grenzen, was es Anwendungen ermöglicht, Geräte mit modernen Plattform-Grafik-APIs zu unterstützen. Dies wird als "core" WebGPU bezeichnet.
Es ist möglich, WebGPU in den "Kompatibilitätsmodus" zu versetzen, was bedeutet, dass der GPUAdapter eine eingeschränkte Teilmenge der WebGPU API unterstützt, die in älteren Grafik-APIs wie OpenGL ES 3.1 und Direct3D 11 ausführbar ist. Dies wird erreicht, indem ein featureLevel Wert von compatibility in Ihrem Call an GPU.requestAdapter() angegeben wird:
Die genauen Einschränkungen des Kompatibilitätsmodus sind im WebGPU-Kompatibilitätsmodus detailliert beschrieben. Eingeschränkte Anwendungen sind dennoch gültige Anwendungen des WebGPU-Kerns, da sie eine Teilmenge des Kern-WebGPU unterstützen und daher auf allen Browsern mit WebGPU-Kernunterstützung laufen, selbst wenn sie den Kompatibilitätsmodus nicht explizit unterstützen.
Ein GPUAdapter oder GPUDevice, das den WebGPU-Kern unterstützt, verfügt über das core-features-and-limits-Feature (siehe GPUSupportedFeatures). Um zu testen, ob eine WebGPU-App im Kern- oder Kompatibilitätsmodus ist, überprüfen Sie, ob das core-features-and-limits-Feature unterstützt wird. Beispielsweise:
Siehe auch Verwendung des Kompatibilitätsmodus nur bei Bedarf.
Eine Pipeline ist eine logische Struktur, die programmierbare Stufen enthält, die abgeschlossen werden müssen, um die Arbeit Ihres Programms zu erledigen. WebGPU ist derzeit in der Lage, zwei Arten von Pipelines zu verwalten:
Eine Render-Pipeline rendert Grafiken, typischerweise in ein <canvas>-Element, kann aber auch Grafiken offscreen rendern. Sie hat zwei Hauptstufen:
Eine Vertex-Stufe, in der ein Vertex-Shader Positionierungsdaten empfängt, die in die GPU eingespeist werden, und diese verwendet, um eine Reihe von Vertices im 3D-Raum zu positionieren, indem spezifizierte Effekte wie Rotation, Translation oder Perspektive angewendet werden. Die Vertices werden dann zu Primitiven wie Dreiecken zusammengefügt (das grundlegende Baustein gerenderter Grafiken) und von der GPU rasterisiert, um herauszufinden, welche Pixel jedes abdecken sollte.
Eine Fragment-Stufe, in der ein Fragment-Shader die Farbe für jedes von den durch den Vertex-Shader produzierten Primitiven abgedeckte Pixel berechnet. Diese Berechnungen verwenden häufig Eingaben wie Bilder (in Form von Texturen), die Oberflächendetails bereitstellen, sowie die Position und Farbe virtueller Lichtquellen.
Eine Computepipeline ist für allgemeine Berechnungen. Eine Computepipeline enthält eine einzelne Computestufe, in der ein Compute-Shader allgemeine Daten verarbeitet, diese parallel über eine bestimmte Anzahl von Arbeitsgruppen bearbeitet und dann das Ergebnis in einem oder mehreren Buffers zurückgibt. Die Buffers können Daten jeder Art enthalten.
Die oben genannten Shader sind Sammlungen von Anweisungen, die von der GPU verarbeitet werden. WebGPU-Shader werden in einer Low-Level-Rust-ähnlichen Sprache namens WebGPU Shading Language (WGSL) geschrieben.
Es gibt mehrere verschiedene Möglichkeiten, wie Sie eine WebGPU-App architektonisch gestalten könnten, aber der Prozess wird wahrscheinlich die folgenden Schritte enthalten:
In den folgenden Abschnitten werden wir ein einfaches Render-Pipeline-Demo untersuchen, um Ihnen die Möglichkeit zu geben, zu erkunden, was es erfordert. Später werden wir auch ein einfaches Compute-Pipeline-Demo betrachten, bei dem wir sehen, wie es sich von der Render-Pipeline unterscheidet.
In unserem einfachen Render-Demo geben wir einem <canvas>-Element einen festen blauen Hintergrund und zeichnen ein Dreieck darauf.
Wir verwenden den folgenden Shadercode. Die Vertex-Shader-Stufe (@vertex-Block) akzeptiert einen Datenblock, der eine Position und eine Farbe enthält, positioniert den Vertex gemäß der angegebenen Position, interpoliert die Farbe und übergibt die Daten an die Fragment-Shader-Stufe. Die Fragment-Shader-Stufe (@fragment-Block) akzeptiert die Daten von der Vertex-Shader-Stufe und färbt den Vertex gemäß der angegebenen Farbe.
Hinweis: In unseren Demos speichern wir unseren Shadercode in einem Template Literal, aber Sie können ihn überall speichern, von wo aus er leicht als Text abgerufen und in Ihr WebGPU-Programm eingespeist werden kann. Zum Beispiel ist es eine weitere häufige Praxis, Shader innerhalb eines <script>-Elements zu speichern und den Inhalt mit Node.textContent abzurufen. Der korrekte Mimetyp für WGSL ist text/wgsl.
Um Ihren Shadercode für WebGPU verfügbar zu machen, müssen Sie ihn in ein GPUShaderModule einfügen, indem Sie einen Aufruf an GPUDevice.createShaderModule() durchführen und Ihren Shadercode als Eigenschaft innerhalb eines Deskriptorobjekts übergeben. Zum Beispiel:
In einer Render-Pipeline müssen wir einen Ort angeben, an den die Grafiken gerendert werden sollen. In diesem Fall erhalten wir einen Verweis auf ein sichtbares <canvas>-Element und rufen HTMLCanvasElement.getContext() mit einem Parameter von webgpu auf, um dessen GPU-Kontext (eine GPUCanvasContext-Instanz) zurückzugeben.
Von dort aus konfigurieren wir den Kontext mit einem Aufruf von GPUCanvasContext.configure(), indem wir ein Optionsobjekt übergeben, das das GPUDevice enthält, von dem die Rendering-Informationen kommen werden, das Format, das die Texturen haben werden, und den Alpha-Modus, der beim Rendern halbtransparenter Texturen verwendet werden soll.
Hinweis: Die beste Praxis zur Bestimmung des Texturformats besteht darin, die Methode GPU.getPreferredCanvasFormat() zu verwenden; diese wählt das effizienteste Format (entweder bgra8unorm oder rgba8unorm) für das Gerät des Nutzers.
Als nächstes stellen wir unserem WebGPU-Programm unsere Daten in einer Form zur Verfügung, die es verwenden kann. Unsere Daten werden zunächst in einem Float32Array bereitgestellt, das 8 Datenpunkte für jeden Dreiecksvertex enthält — X, Y, Z, W für die Position und R, G, B, A für die Farbe.
Wir haben jedoch ein Problem hier. Wir müssen unsere Daten in einen GPUBuffer bekommen. Hinter den Kulissen wird diese Art von Buffer im Speicher gespeichert, der sehr eng mit den Kernen der GPU integriert ist, um die gewünschte Hochleistungsverarbeitung zu ermöglichen. Als Nebeneffekt kann dieser Speicher nicht von Prozessen auf dem Host-System, wie dem Browser, zugegriffen werden.
Der GPUBuffer wird durch einen Aufruf an GPUDevice.createBuffer() erstellt. Wir geben ihm eine Größe, die der Länge des vertices-Arrays entspricht, damit es alle Daten enthalten kann, und VERTEX- und COPY_DST-Nutzungsflags an, um anzugeben, dass der Buffer als Vertexbuffer und das Ziel von Kopiervorgängen verwendet wird.
Wir könnten das Einbringen unserer Daten in den GPUBuffer mit einer Mapping-Operation handhaben, wie wir es im Compute-Pipeline-Demo verwenden, um Daten von der GPU zurück zu JavaScript zu lesen. In diesem Fall verwenden wir jedoch die praktische GPUQueue.writeBuffer()-Convenience-Methode, die als Parameter den Buffer zum Schreiben, die Datenquelle, die geschrieben werden sollen, einen Offset-Wert für jeden und die Größe der zu schreibenden Daten erhält (wir haben die gesamte Länge des Arrays angegeben). Der Browser arbeitet dann den effizientesten Weg aus, um das Schreiben der Daten zu erledigen.
Nachdem wir unsere Daten in einen Buffer bekommen haben, ist der nächste Teil der Einrichtung, unsere Pipeline tatsächlich zu erstellen, damit sie zum Rendern verwendet werden kann.
Zunächst erstellen wir ein Objekt, das das erforderliche Layout unserer Vertexdaten beschreibt. Dies beschreibt perfekt, was wir zuvor in unserem vertices-Array und der Vertex-Shader-Stufe gesehen haben — jeder Vertex hat Position-, und Farbdaten. Beide sind im float32x4-Format formatiert (was auf den WGSL vec4<f32>-Typ abbildet), und die Farbdaten beginnen mit einem Offset von 16 Bytes in jedem Vertex. arrayStride gibt die "Schrittweite" an, also die Anzahl der Bytes, die jeden Vertex ausmachen, und stepMode gibt an, dass die Daten pro Vertex abgerufen werden sollen.
Als nächstes erstellen wir ein Deskriptorobjekt, das die Konfiguration unserer Render-Pipeline-Stufen festlegt. Für beide Shader-Stufen spezifizieren wir das GPUShaderModule, in dem der relevante Code gefunden werden kann (shaderModule), und den Namen der Funktion, die als Einstiegspunkt für jede Stufe dient.
Darüber hinaus stellen wir im Fall der Vertex-Shader-Stufe unser vertexBuffers-Objekt bereit, um den erwarteten Zustand unserer Vertexdaten bereitzustellen. Und im Fall unserer Fragment-Shader-Stufe bereitstellen wir ein Array von Farbenzielzuständen, die das spezifizierte Rendering-Format angeben (dies entspricht dem in unserer Canvas-Kontext-Konfiguration früher festgelegten Format).
Wir spezifizieren auch ein primitive-Objekt, das in diesem Fall nur den Typ des Primitiven angibt, das wir zeichnen werden, und wir spezifizieren ein layout von auto. Die Eigenschaft layout definiert das Layout (Struktur, Zweck und Typ) aller GPU-Ressourcen (Buffers, Texturen usw.), die während der Ausführung der Pipeline verwendet werden. In komplexeren Apps würde dies die Form eines GPUPipelineLayout-Objekts annehmen, das mit GPUDevice.createPipelineLayout() erstellt wurde (Sie können ein Beispiel in unserer Grundlegenden Compute-Pipeline sehen), das es der GPU ermöglicht, die Pipeline vorab am effizientesten auszuführen. Wir geben jedoch den Wert auto an, der die Pipeline ein implizites Bindungslayout basierend auf jedem in den Shadercode definiertem Bindung zu erstellen.
Schließlich können wir eine GPURenderPipeline basierend auf unserem pipelineDescriptor-Objekt erstellen, indem wir es als Parameter an einen anruf an GPUDevice.createRenderPipeline() übergeben.
Nun, da die gesamte Einrichtung abgeschlossen ist, können wir tatsächlich einen Rendering-Pass ausführen und etwas auf unser <canvas> zeichnen. Um irgendwelche Befehle zu kodieren, die später an die GPU ausgegeben werden sollen, müssen Sie eine GPUCommandEncoder-Instanz erstellen, die durch einen Aufruf GPUDevice.createCommandEncoder() erfolgt.
Als nächstes starten wir den Rendering-Pass, indem wir eine GPURenderPassEncoder-Instanz mit einem Aufruf zu GPUCommandEncoder.beginRenderPass() erstellen. Diese Methode nimmt ein Deskriptionsobjekt als Parameter, dessen einzige obligatorische Eigenschaft ein colorAttachments-Array ist. In diesem Fall geben wir an:
Wir können jetzt Methoden des Rendering-Pass-Encoders aufrufen, um unser Dreieck zu zeichnen:
Um die Codierung der Befehlssequenz abzuschließen und sie an die GPU zu übergeben, sind drei weitere Schritte erforderlich.
Diese drei Schritte können mit den folgenden zwei Zeilen erreicht werden:
In unserem einfachen Compute-Demo lassen wir die GPU einige Werte berechnen, diese in einem Ausgabepuffer speichern, die Daten in einen Zwischenpuffer kopieren, diesen Zwischenpuffer mappen, sodass die Daten in JavaScript gelesen und in der Konsole protokolliert werden können.
Die App folgt einer ähnlichen Struktur wie das grundlegende Rendering-Demo. Wir erstellen einen GPUDevice-Verweis auf dieselbe Weise wie zuvor und umschließen unseren Shadercode in einem GPUShaderModule durch einen Aufruf von GPUDevice.createShaderModule(). Der Unterschied hier ist, dass unser Shadercode nur eine Shaderstufe hat, eine @compute-Stufe:
In diesem Beispiel erstellen wir zwei GPUBuffer-Instanzen, um unsere Daten zu verwalten: einen output-Buffer, um die GPU-Berechnungsergebnisse mit hoher Geschwindigkeit zu schreiben, und einen stagingBuffer, in den wir die Inhalte des output kopieren, der gemappt werden kann, um JavaScript den Zugriff auf die Werte zu ermöglichen.
Wenn die Pipeline erstellt wird, geben wir eine Bindungsgruppe an, die für die Pipeline verwendet wird. Dies beinhaltet zunächst die Erstellung eines GPUBindGroupLayout (über einen Aufruf von GPUDevice.createBindGroupLayout()), der die Struktur und den Zweck von GPU-Ressourcen wie Buffern definiert, die in dieser Pipeline verwendet werden. Dieses Layout wird als Vorlage für Bindungsgruppen verwendet, an die man sich halten muss. In diesem Fall geben wir der Pipeline den Zugriff auf einen einzelnen Speicherbuffer, der an den Bindungsslot 0 gebunden ist (dies entspricht der relevanten Bindungsnummer in unserem Shadercode — @binding(0)), nutzbar in der Computestufe der Pipeline und mit dem Zweck des Buffers als storage.
Als nächstes erstellen wir eine GPUBindGroup, indem wir GPUDevice.createBindGroup() aufrufen. Wir übergeben diesem Methodenaufruf ein Deskriptorobjekt, das das Bindungsgruppen-Layout spezifiziert, auf dem diese Bindungsgruppe basieren soll, und die Details der Variable, die an den im Layout definierten Slot gebunden werden soll. In diesem Fall deklarieren wir Bindung 0 und spezifizieren, dass der zuvor definierte output-Buffer daran gebunden werden soll.
Hinweis: Sie könnten ein implizites Layout abrufen, um es beim Erstellen einer Bindungsgruppe zu verwenden, indem Sie die Methode GPUComputePipeline.getBindGroupLayout() aufrufen. Es gibt auch eine Version für Render-Pipelines: siehe GPURenderPipeline.getBindGroupLayout().
Mit dem oben Gesagten können wir nun eine Compute-Pipeline erstellen, indem wir GPUDevice.createComputePipeline() aufrufen und ein Pipeline-Deskriptorobjekt übergeben. Dies funktioniert ähnlich wie die Erstellung einer Render-Pipeline. Wir beschreiben den Compute-Shader, indem wir angeben, in welchem Modul der Code gefunden werden kann und was der Einstiegspunkt ist. Wir spezifizieren auch ein layout für die Pipeline, in diesem Fall erstellen wir ein Layout basierend auf dem bindGroupLayout, das wir zuvor durch einen Aufruf von GPUDevice.createPipelineLayout() definiert haben.
Ein Unterschied hier zum Render-Pipeline-Layout besteht darin, dass wir keinen primitiven Typ angeben, da wir nichts zeichnen.
Das Ausführen eines Compute-Passes ähnelt im Aufbau dem Ausführen eines Rendering-Passes, mit einigen unterschiedlichen Befehlen. Zunächst wird der Pass-Encoder mithilfe von GPUCommandEncoder.beginComputePass() erstellt.
Bei der Ausgabe der Befehle spezifizieren wir die Pipeline, die in gleicher Weise wie zuvor verwendet werden soll, mit GPUComputePassEncoder.setPipeline(). Wir verwenden dann jedoch GPUComputePassEncoder.setBindGroup(), um anzugeben, dass wir unsere bindGroup verwenden möchten, um die Daten zu spezifizieren, die in der Berechnung verwendet werden sollen, und GPUComputePassEncoder.dispatchWorkgroups(), um die Anzahl der GPU-Arbeitsgruppen anzugeben, die zur Durchführung der Berechnungen verwendet werden sollen.
Wir signalisieren dann das Ende der Renderpass-Befehlsliste mit GPURenderPassEncoder.end().
Bevor wir die codierten Befehle zur Ausführung mit GPUQueue.submit() an die GPU übermitteln, kopieren wir den Inhalt des output-Buffers mit GPUCommandEncoder.copyBufferToBuffer() in den stagingBuffer.
Sobald die Ausgabedaten im stagingBuffer verfügbar sind, verwenden wir die Methode GPUBuffer.mapAsync(), um die Daten in den Zwischenpeicher zu mappen, holen uns dann einen Verweis auf den gemappten Bereich mittels GPUBuffer.getMappedRange(), kopieren die Daten in JavaScript und protokollieren sie dann in der Konsole. Außerdem demappen wir den stagingBuffer, sobald wir fertig sind.
WebGPU-Aufrufe werden im GPU-Prozess asynchron validiert. Wenn Fehler gefunden werden, wird der problematische Aufruf auf der GPU-Seite als ungültig markiert. Wenn ein anderer Aufruf gemacht wird, der von dem Rückgabewert eines ungültig markierten Aufrufs abhängt, wird auch dieses Objekt als ungültig markiert und so weiter. Aus diesem Grund werden Fehler in WebGPU als "ansteckend" bezeichnet.
Jede GPUDevice-Instanz pflegt ihren eigenen Fehlerbereichs-Stack. Dieser Stack ist zunächst leer, aber Sie können beginnen, einen Fehlerbereich an den Stack zu pushen, indem Sie GPUDevice.pushErrorScope() aufrufen, um Fehler eines bestimmten Typs zu erfassen.
Wenn Sie mit der Fehlererfassung fertig sind, können Sie die Erfassung beenden, indem Sie GPUDevice.popErrorScope() aufrufen. Dies entfernt den Bereich aus dem Stack und gibt ein Promise zurück, das sich zu einem Objekt (GPUInternalError, GPUOutOfMemoryError oder GPUValidationError) auflöst, das den ersten im Bereich erfassten Fehler beschreibt, oder null, wenn keine Fehler erfasst wurden.
Wir haben versucht, nützliche Informationen bereitzustellen, um Ihnen zu helfen, zu verstehen, warum in Ihrem WebGPU-Code Fehler auftreten, in "Validierungs"-Abschnitten, wo es angebracht ist, die Kriterien aufzulisten, die zu erfüllen sind, um Fehler zu vermeiden. Siehe zum Beispiel den Validierungsabschnitt zu GPUDevice.createBindGroup(). Einige dieser Informationen sind komplex; anstatt die Spezifikation zu wiederholen, haben wir beschlossen, nur Fehlerkriterien aufzulisten, die:
Sie können mehr Informationen über die Fehlerbehandlung in WebGPU im Erklärer finden — siehe Objektgültigkeit und Zerstörung und Fehler. Beste Praktiken zur WebGPU-Fehlerbehandlung bietet nützliche reale Beispiele und Ratschläge.
Hinweis: Die historische Art und Weise, Fehler in WebGL zu behandeln, besteht darin, eine Methode getError() bereitzustellen, um Fehlerinformationen zurückzugeben. Das ist problematisch, da es Fehler synchron zurückgibt, was schlecht für die Leistung ist — jeder Aufruf erfordert eine Hin- und Rückfahrt zur GPU und verlangt, dass alle zuvor ausgegebenen Operationen abgeschlossen werden. Sein Zustandsmodell ist auch flach, was bedeutet, dass Fehler zwischen nicht verwandtem Code durchlecken können. Die Entwickler von WebGPU waren entschlossen, diese Situation zu verbessern.
Der Einstiegspunkt für die API — gibt das GPU-Objekt für den aktuellen Kontext zurück.
GPUDer Ausgangspunkt zur Nutzung von WebGPU. Kann verwendet werden, um einen GPUAdapter zurückzugeben.
GPUAdapterRepräsentiert einen GPU-Adapter. Von hier aus können Sie ein GPUDevice, Adapterinformationen, Funktionen und Limits anfordern.
GPUAdapterInfoEnthält identifizierende Informationen über einen Adapter.
Repräsentiert ein logisches GPU-Gerät. Dies ist die Hauptschnittstelle, über die auf den Großteil der WebGPU-Funktionalität zugegriffen wird.
GPUSupportedFeaturesEin setlike-Objekt, das zusätzliche Funktionalität beschreibt, die von einem GPUAdapter oder GPUDevice unterstützt wird.
GPUSupportedLimitsBeschreibt die von einem GPUAdapter oder GPUDevice unterstützten Limits.
Das Aufrufen von getContext() mit dem "webgpu" contextType gibt eine GPUCanvasContext-Objektinstanz zurück, die dann mit GPUCanvasContext.configure() konfiguriert werden kann.
GPUCanvasContextRepräsentiert den WebGPU-Renderingkontext eines <canvas>-Elements.
Repräsentiert einen Speicherblock, der verwendet werden kann, um Rohdaten zu speichern, die in GPU-Operationen verwendet werden sollen.
GPUExternalTextureEin Wrapper-Objekt, das ein HTMLVideoElement-Schnappschuss enthält, der als Textur in GPU-Rendering-Operationen verwendet werden kann.
GPUSamplerKontrolliert, wie Shader Textur-Ressourcendaten transformieren und filtern.
GPUShaderModuleEine Referenz auf ein internes Shader-Modul-Objekt, einen Container für WGSL-Shadercode, der zur Ausführung durch eine Pipeline an die GPU übergeben werden kann.
GPUTextureEin Container, der zum Speichern von 1D-, 2D- oder 3D-Datenarrays, wie Bilder, zum Gebrauch in GPU-Rendering-Operationen verwendet wird.
GPUTextureViewEine Ansicht auf eine Teilmenge der durch eine bestimmte GPUTexture definierten Textur-Ressourcen.
Basierend auf einem GPUBindGroupLayout, definiert eine GPUBindGroup eine Gruppe von Ressourcen, die gemeinsam gebunden und genutzt werden und wie diese Ressourcen in Shaderstufen eingesetzt werden.
GPUBindGroupLayoutDefiniert die Struktur und den Zweck verwandter GPU-Ressourcen wie Buffers, die in einer Pipeline verwendet werden, und wird als Vorlage beim Erstellen von GPUBindGroups verwendet.
GPUComputePipelineKontrolliert die Compute-Shader-Stufe und kann in einem GPUComputePassEncoder verwendet werden.
GPUPipelineLayoutDefiniert die GPUBindGroupLayouts, die von einer Pipeline verwendet werden. GPUBindGroups, die mit der Pipeline während der Befehlskodierung verwendet werden, müssen kompatible GPUBindGroupLayouts haben.
GPURenderPipelineKontrolliert die Vertex- und Fragment-Shader-Stufen und kann in einem GPURenderPassEncoder oder GPURenderBundleEncoder verwendet werden.
Repräsentiert eine aufgezeichnete Liste von GPU-Befehlen, die zur Ausführung an eine GPUQueue übermittelt werden können.
GPUCommandEncoderRepräsentiert einen Befehls-Encoder, der verwendet wird, um Befehle zu kodieren, die an die GPU ausgegeben werden sollen.
GPUComputePassEncoderKodiert Befehle, die das Steuern der Compute-Shader-Stufe betreffen, wie sie von einer GPUComputePipeline ausgegeben werden. Teil der gesamten Kodierungsaktivität eines GPUCommandEncoder.
GPUQueueSteuert die Ausführung kodierter Befehle auf der GPU.
GPURenderBundleEin Container für vorab aufgezeichnete Befehlsbündel (siehe GPURenderBundleEncoder).
GPURenderBundleEncoderWird verwendet, um Bündel von Befehlen vorab aufzuzeichnen. Diese können so oft wie erforderlich in GPURenderPassEncoders über die Methode executeBundles() wiederverwendet werden.
GPURenderPassEncoderKodiert Befehle, die das Steuern der Vertex- und Fragment-Shader-Stufen betreffen, wie sie von einer GPURenderPipeline ausgegeben werden. Teil der gesamten Kodierungsaktivität eines GPUCommandEncoder.
Wird verwendet, um die Ergebnisse von Abfragen in Passes zu erfassen, wie Occlusion- oder Zeitstempelabfragen.
Ein Array von GPUCompilationMessage-Objekten, das vom GPU-Shadermodul-Compiler generiert wurde, um bei der Diagnose von Problemen mit Shadercode zu helfen.
GPUCompilationMessageRepräsentiert eine einzelne Informations-, Warn- oder Fehlermeldung, die vom GPU-Shadermodul-Compiler generiert wurde.
GPUDeviceLostInfoWird zurückgegeben, wenn das GPUDevice.lost-Promise sich auflöst und Informationen darüber bereitstellt, warum das Gerät verloren ging.
GPUErrorDie Basis-Schnittstelle für Fehler, die von GPUDevice.popErrorScope und dem uncapturederror-Ereignis an die Oberfläche kommen.
GPUInternalErrorEine der Fehlerarten, die von GPUDevice.popErrorScope und dem GPUDevice uncapturederror-Ereignis an die Oberfläche kommen. Gibt an, dass ein Vorgang aus einem system- oder implementierungsspezifischen Grund fehlgeschlagen ist, auch wenn alle Validierungsanforderungen erfüllt wurden.
GPUOutOfMemoryErrorEine der Fehlerarten, die von GPUDevice.popErrorScope und dem GPUDevice uncapturederror-Ereignis an die Oberfläche kommen. Gibt an, dass nicht genügend freier Speicher verfügbar war, um die angeforderte Operation abzuschließen.
GPUPipelineErrorBeschreibt einen Pipeline-Fehler. Der empfangene Wert, wenn ein von GPUDevice.createComputePipelineAsync() oder GPUDevice.createRenderPipelineAsync() zurückgegebenes Promise abgelehnt wird.
GPUUncapturedErrorEventDer Ereignisobjekttyp für das GPUDevice uncapturederror-Ereignis.
GPUValidationErrorEine der Fehlerarten, die von GPUDevice.popErrorScope und dem GPUDevice uncapturederror-Ereignis an die Oberfläche kommen. Beschreibt einen Anwendungsfehler, der anzeigt, dass ein Vorgang die Validierungseinschränkungen der WebGPU API nicht bestanden hat.
Die gesamte API ist nur in einem sicheren Kontext verfügbar.
| WebGPU # gpu-interface |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.