WGSL-Erweiterung „fragment_depth“
Bei geometrieintensiven Renderdurchgängen sind Early-Z-Optimierungen die beste Wahl für Entwickler. Sie sorgen für eine enorme Leistungssteigerung, da die GPU ausgeblendete Pixel verwerfen kann, bevor rechenintensive Fragment-Shader ausgeführt werden. Wenn eine gerasterte Tiefe den Tiefentest nicht besteht, überspringt die GPU den Fragment-Shader vollständig, sofern der Shader keine anderen Nebenwirkungen hat.
Wenn Sie mehr darüber erfahren möchten, wie Hardware damit umgeht, finden Sie bei MJP einen hervorragenden Artikel zum Thema Wann muss Early-Z deaktiviert werden?.
Die benutzerdefinierte Tiefenmanipulation ist zwar nützlich, aber wenn Sie sie in Ihrem Fragment-Shader durchführen, hat das einen versteckten Nachteil. Das Schreiben in @builtin(frag_depth) innerhalb eines Fragment-Shaders zwingt Treiber in der Regel dazu, diese Early-Z-Optimierungen für den gesamten Zeichenbefehl zu deaktivieren. Das liegt daran, dass die Heuristik des Treibers nicht garantieren kann, dass die berechnete Ausgabetiefe des Shaders mit der vom Rasterizer interpolierten Tiefe übereinstimmt.
Um dieses Leistungsproblem zu beheben, können Sie mit der WGSL-Erweiterung fragment_depth einen Tiefenmodusnamen less oder greater für @builtin(frag_depth) angeben, um explizit anzugeben, wie sich die geschriebene Tiefe zur interpolierten Tiefe verhält. So kann die GPU Early-Z-Optimierungen sicher anwenden.
Diese Spracherweiterung kann in JavaScript mit navigator.gpu.wgslLanguageFeatures erkannt werden. Es wird empfohlen, eine requires-Anweisung zu verwenden, um die potenzielle Nicht-Portabilität mit requires fragment_depth; am Anfang des WGSL-Shader-Codes zu signalisieren. Sehen Sie sich das folgende Beispiel und die Absicht zur Veröffentlichung an.
if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
throw new Error(`WGSL fragment depth is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires fragment_depth;
@fragment
fn main() -> @builtin(frag_depth, less) f32 {
// Explicitly states that the output fragment depth is less than early-Z depth,
// allowing the GPU to safely preserve early-Z optimizations.
return 0.0f;
}`,
});
Texturkomprimierung nicht ausgerichtet
Mit dem GPU-Feature „texture-compression-unaligned“ können komprimierte Texturen mit Abmessungen erstellt werden, die keine ganzzahligen Vielfachen der Blockgröße sind (z. B. 4 × 4 für BC-, ETC2- und ASTC-Formate). Bisher mussten Texturgrößen in WebGPU strikt an diesen Blockgrenzen ausgerichtet sein. Da Texturen nicht mehr aufgefüllt oder skaliert werden müssen, um sie an die Blockausrichtung anzupassen, bleibt die ursprüngliche Komprimierungsqualität erhalten, ohne dass es zu Skalierungsverzerrungen kommt. Weitere Informationen finden Sie unter Intent to Ship.
Im folgenden Code-Snippet wird geprüft, ob der Adapter die nicht ausgerichtete Texturkomprimierung unterstützt. Falls ja, wird ein Gerät mit dieser Funktion angefordert.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
requiredFeatures: ["texture-compression-unaligned"],
});
Vielen Dank an den externen Mitwirkenden Ignacio Castaño von spark.js für die Entwicklung dieses Features, der Spezifikation und der CTS-Arbeit.
Farbräume „srgb-linear“ und „display-p3-linear“
Durch die vordefinierten Farbräume „srgb-linear“ und „display-p3-linear“ kann der WebGPU-Canvas-Kontext jetzt direkt in linearen Farbräumen mit erweitertem Bereich gerendert werden, um Displays mit großem Farbraum zu unterstützen. Diese Farbräume behalten eine lineare Beziehung zwischen Pixelwerten und physischer Luminanz bei. Dadurch eignen sie sich ideal für das Rendern von physischem Licht in Spielen sowie für räumliche Verarbeitungsaufgaben wie Anti-Aliasing, Interpolation und Dezimierung. Weitere Informationen finden Sie unter Intent to Ship und Particles (HDR) sample PR #574.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
context.configure({
device,
format: "rgba16float",
colorSpace: "display-p3-linear",
});
Zusätzliches snorm10-10-10-2-Vertex-Format
Das Vertex-Format „snorm10-10-10-2“ ist ein gepacktes 32-Bit-Format mit vier vorzeichenbehafteten normalisierten Werten: drei 10-Bit-Komponenten (r, g, b) und eine 2-Bit-Komponente (a). Mit diesem Format können Sie Attribute wie 3D-Normalenvektoren mit einem zusätzlichen 2-Bit-Skalar oder ein Ausrichtungs-Flag effizient speichern und gleichzeitig Speicherbandbreite sparen. Siehe Spezifikation PR 6491.
f16-Unterstützung unter Linux für NVIDIA
Die optionale Funktion „shader-f16“, die Unterstützung für 16-Bit-Gleitkommawerte in WGSL bietet, wird jetzt unter Linux für aktuelle NVIDIA-GPU-Treiber unterstützt. Weitere Informationen finden Sie unter Problem chromium:42251215.
Dawn-Updates
Sie können jetzt die LUID des zugrunde liegenden DXGIAdapters für einen bestimmten GPU-Adapter mit der Struktur WGPUAdapterPropertiesD3D abfragen. Weitere Informationen finden Sie unter issue chromium:562849566.
Dies sind einige der wichtigsten Highlights. Eine vollständige Liste der Commits finden Sie hier.
What's New in WebGPU
Eine Liste aller Themen, die in der Reihe Neu in WebGPU behandelt wurden.
Chrome 155–156
- WGSL-Erweiterung „fragment_depth“
- Nicht ausgerichtete Texturkomprimierung
- Farbräume „srgb-linear“ und „display-p3-linear“
- Zusätzliches snorm10-10-10-2-Vertex-Format
- f16-Unterstützung unter Linux für NVIDIA
- Dawn-Updates
Chrome 153–154
- WGSL-Erweiterung „buffer_view“
- WGSL-Erweiterung „swizzle_assignment“
- Aktualisierungen der WGSL-Erweiterung
- Dawn-Updates
Chrome 151–152
- Steuerung der Untergruppengröße
- OperationError für Validierungsfehler bei setImmediates
- Dawn-Updates
Chrome 149–150
Chrome 147–148
Chrome 146
- WebGPU-Kompatibilitätsmodus unter OpenGL ES 3.1 unterstützen
- Vorübergehende Anhänge
- WGSL-Erweiterung „texture_and_sampler_let“
- Dawn-Updates
Chrome 145
- WGSL-Erweiterung „subgroup_uniformity“
- Experimentelle synchrone Pufferzuordnung in Workern
- Dawn-Updates
Chrome 144
- WGSL-Erweiterung „subgroup_id“
- WGSL-Erweiterung „uniform_buffer_standard_layout“
- WebGPU unter Linux
- Schnellere writeBuffer- und writeTexture-Funktionen
- Dawn-Updates
Chrome 143
- Swizzling von Texturkomponenten
- Nutzung von bgra8unorm-Schreibgeschützten Speichertexturen entfernen
- Dawn-Updates
Chrome 142
Chrome 141
- Tint IR abgeschlossen
- Analyse des Ganzzahlbereichs im WGSL-Compiler
- SPIR-V 1.4-Update für Vulkan-Backend
- Dawn-Updates
Chrome 140
- Geräteanfragen verbrauchen Adapter
- Kurzschreibweise für die Verwendung von Texturen, wenn die Texturansicht verwendet wird
- WGSL-textureSampleLevel unterstützt 1D-Texturen
- Einstellung der Verwendung von schreibgeschützten bgra8unorm-Speichertexturen
- Entfernung des GPUAdapter-Attributs „isFallbackAdapter“
- Dawn-Updates
Chrome 139
- Unterstützung von 3D-Texturen für die komprimierten Formate BC und ASTC
- Neue Funktion „core-features-and-limits“
- Ursprungstest für den WebGPU-Kompatibilitätsmodus
- Dawn-Updates
Chrome 138
- Kurzschreibweise für die Verwendung des Puffers als Bindungsressource
- Änderungen der Größenanforderungen für Puffer, die bei der Erstellung zugeordnet werden
- Architekturbericht für aktuelle GPUs
- GPUAdapter-Attribut „isFallbackAdapter“ wird eingestellt
- Dawn-Updates
Chrome 137
- Texturansicht für externalTexture-Bindung verwenden
- Pufferkopie ohne Angabe von Offsets und Größe
- WGSL-workgroupUniformLoad mit Zeiger auf atomischen Wert
- GPUAdapterInfo-Attribut „powerPreference“
- GPURequestAdapterOptions-Attribut „compatibilityMode“ entfernen
- Dawn-Updates
Chrome 136
- GPUAdapterInfo-Attribut „isFallbackAdapter“
- Verbesserungen bei der Shader-Kompilierungszeit in D3D12
- Canvas-Bilder speichern und kopieren
- Einschränkungen des Kompatibilitätsmodus für die Anzeigenwirkung auf die Markenbekanntheit
- Dawn-Updates
Chrome 135
- Erstellung von Pipeline-Layouts mit Null-Bindungsgruppen-Layout zulassen
- Zulassen, dass sich Darstellungsbereiche über die Grenzen der Renderziele hinaus erstrecken
- Einfacherer Zugriff auf den experimentellen Kompatibilitätsmodus unter Android
- Limit „maxInterStageShaderComponents“ entfernen
- Dawn-Updates
Chrome 134
- Arbeitslasten für maschinelles Lernen mit Untergruppen verbessern
- Unterstützung für filterbare Gleitkomma-Texturtypen als mischbar entfernen
- Dawn-Updates
Chrome 133
- Zusätzliche unorm8x4-bgra- und 1-Komponenten-Vertex-Formate
- Anfrage unbekannter Limits mit undefiniertem Wert zulassen
- Änderungen an den WGSL-Ausrichtungsregeln
- WGSL-Leistungssteigerungen mit „discard“
- VideoFrame-displaySize für externe Texturen verwenden
- Bilder mit nicht standardmäßigen Ausrichtungen mit copyExternalImageToTexture verarbeiten
- Für die Entwicklung optimiert
- Kompatibilitätsmodus mit featureLevel aktivieren
- Bereinigung experimenteller Untergruppenfunktionen
- Limit „maxInterStageShaderComponents“ wird eingestellt
- Dawn-Updates
Chrome 132
- Nutzung der Texturansicht
- Zusammenführen von 32-Bit-Gleitkommatexturen
- GPUDevice-Attribut „adapterInfo“
- Konfiguration des Canvas-Kontexts mit ungültigem Format löst JavaScript-Fehler aus
- Einschränkungen für Filter-Sampler bei Texturen
- Erweiterte Tests mit Untergruppen
- Für die Entwicklung optimiert
- Experimentelle Unterstützung für normalisierte 16-Bit-Texturformate
- Dawn-Updates
Chrome 131
- Clip-Abstände in WGSL
- GPUCanvasContext getConfiguration()
- Punkt- und Linienprimitive dürfen keine Tiefenverzerrung haben
- Integrierte Funktionen für inklusiven Scan für Untergruppen
- Experimentelle Unterstützung für Multi-Draw Indirect
- Shader-Modul-Kompilierungsoption „strict math“
- GPUAdapter-Methode „requestAdapterInfo()“ entfernen
- Dawn-Updates
Chrome 130
- Zusammenführung von zwei Quellen
- Verbesserungen bei der Shader-Kompilierungszeit in Metal
- Einstellung von GPUAdapter requestAdapterInfo()
- Dawn-Updates
Chrome 129
- HDR-Unterstützung mit Canvas-Tone-Mapping-Modus
- Erweiterte Unterstützung für Untergruppen
- Dawn-Updates
Chrome 128
- Mit Untergruppen experimentieren
- Einstellung der Tiefenverzerrung für Linien und Punkte wird eingestellt
- Warnung zu nicht erfassten Fehlern in den Entwicklertools ausblenden, wenn „preventDefault“ verwendet wird
- WGSL-Interpolations-Sampling zuerst und entweder
- Dawn-Updates
Chrome 127
- Experimentelle Unterstützung für OpenGL ES unter Android
- GPUAdapter-Attribut „info“
- Verbesserungen bei der WebAssembly-Interoperabilität
- Verbesserte Fehler bei Befehlscodierern
- Dawn-Updates
Chrome 126
- Limit für „maxTextureArrayLayers“ erhöhen
- Optimierung des Puffer-Uploads für das Vulkan-Backend
- Verbesserungen bei der Shader-Kompilierungszeit
- Gesendete Befehlspuffer müssen eindeutig sein
- Dawn-Updates
Chrome 125
Chrome 124
- Schreibgeschützte und beschreibbare Speichertexturen
- Unterstützung für Service Worker und Shared Worker
- Neue Attribute für Adapterinformationen
- Diverse Fehlerkorrekturen
- Dawn-Updates
Chrome 123
- Unterstützung für integrierte DP4a-Funktionen in WGSL
- Uneingeschränkte Zeigerparameter in WGSL
- Syntaktischer Zucker für die Dereferenzierung von zusammengesetzten Typen in WGSL
- Separater Lesezugriff-Status für Schablonen- und Tiefenaspekte
- Dawn-Updates
Chrome 122
- Reichweite mit dem Kompatibilitätsmodus erhöhen (Funktion in Entwicklung)
- Limit für „maxVertexAttributes“ erhöhen
- Dawn-Updates
Chrome 121
- WebGPU auf Android unterstützen
- DXC anstelle von FXC für die Shader-Kompilierung unter Windows verwenden
- Zeitstempelabfragen in Rechen- und Rendering-Durchgängen
- Standardeinstiegspunkte für Shader-Module
- Unterstützung für display-p3 als GPUExternalTexture-Farbraum
- Informationen zu Heapspeichern
- Dawn-Updates
Chrome 120
- Unterstützung für 16-Bit-Gleitkommawerte in WGSL
- Grenzen überwinden
- Änderungen am Tiefen-Stencil-Status
- Aktualisierung der Adapterinformationen
- Quantisierung von Zeitstempelabfragen
- Funktionen für den Frühjahrsputz
Chrome 119
- Filterbare 32-Bit-Gleitkomma-Texturen
- unorm10-10-10-2-Vertex-Format
- rgb10a2uint-Texturformat
- Dawn-Updates
Chrome 118
- Unterstützung für HTMLImageElement und ImageData in
copyExternalImageToTexture() - Experimentelle Unterstützung für Lese-/Schreib- und Lesezugriff-Speichertexturen
- Dawn-Updates
Chrome 117
- Vertex-Zwischenspeicher zurücksetzen
- Bindungsgruppe aufheben
- Fehler bei der asynchronen Pipelineerstellung unterdrücken, wenn das Gerät verloren geht
- Aktualisierungen bei der Erstellung von SPIR-V-Shader-Modulen
- Für die Entwicklung optimiert
- Caching-Pipelines mit automatisch generiertem Layout
- Dawn-Updates
Chrome 116
- WebCodecs-Integration
- Verlorenes Gerät von GPUAdapter
requestDevice()zurückgegeben - Videowiedergabe flüssig halten, wenn
importExternalTexture()aufgerufen wird - Spezifikationskonformität
- Für die Entwicklung optimiert
- Dawn-Updates
Chrome 115
- Unterstützte WGSL-Spracherweiterungen
- Experimentelle Unterstützung für Direct3D 11
- Standardmäßig dedizierte GPU bei Netzbetrieb verwenden
- Für die Entwicklung optimiert
- Dawn-Updates
Chrome 114
- JavaScript optimieren
- „getCurrentTexture()“ auf nicht konfiguriertem Canvas löst „InvalidStateError“ aus
- WGSL-Updates
- Dawn-Updates