Neu in WebGPU (Chrome 155–156)

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

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113