Novità di WebGPU (Chrome 155-156)

Estensione fragment_depth WGSL

Nelle fasi di rendering ad alta intensità di geometria, le ottimizzazioni early-Z sono le migliori amiche degli sviluppatori. Offrono un enorme aumento delle prestazioni consentendo alla GPU di scartare i pixel nascosti prima di eseguire costosi fragment shader. Se una profondità rasterizzata non supera il test di profondità, la GPU ignora completamente lo shader dei frammenti, a condizione che lo shader non abbia altri effetti collaterali.

Se vuoi approfondire il modo in cui l'hardware gestisce questo problema, MJP ha un ottimo articolo su When Does Early-Z Have to be Disabled?.

Sebbene la manipolazione della profondità personalizzata sia utile, eseguirla nel fragment shader comporta un costo nascosto. La scrittura su @builtin(frag_depth) all'interno di un fragment shader in genere costringe i driver a disattivare queste ottimizzazioni early-Z per l'intera chiamata di disegno. Ciò accade perché l'euristica del driver non può garantire che la profondità di output calcolata dello shader corrisponda alla profondità interpolata dal rasterizzatore.

Per risolvere questo problema di prestazioni, l'estensione WGSL fragment_depth consente di specificare un nome della modalità di profondità less o greater su @builtin(frag_depth) per indicare esplicitamente il confronto tra la profondità scritta e quella interpolata, consentendo alla GPU di applicare in sicurezza le ottimizzazioni early-Z.

Questa estensione del linguaggio può essere rilevata in JavaScript utilizzando navigator.gpu.wgslLanguageFeatures. Ti consigliamo di utilizzare una direttiva requires per segnalare la potenziale non portabilità con requires fragment_depth; all'inizio del codice dello shader WGSL. Consulta l'esempio seguente e l'intent to ship.

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;
  }`,
});

Compressione delle texture non allineata

La funzionalità GPU "texture-compression-unaligned" consente di creare texture compresse con dimensioni che non sono multipli interi della dimensione del blocco (ad esempio 4x4 per i formati BC, ETC2 e ASTC). In precedenza, WebGPU richiedeva rigorosamente che le dimensioni delle texture fossero allineate a questi confini dei blocchi. Eliminando la necessità di aggiungere spaziatura o scalare le texture per adattarle agli allineamenti dei blocchi, questa funzionalità preserva la fedeltà della compressione originale senza introdurre distorsioni di scalabilità. Consulta l'intent to ship.

Il seguente snippet di codice controlla se l'adattatore supporta la compressione delle texture non allineata e, se disponibile, richiede un dispositivo con questa funzionalità.

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"],
});

Un ringraziamento speciale al collaboratore esterno Ignacio Castaño di spark.js per aver guidato lo sviluppo di questa funzionalità, delle specifiche e del CTS.

Spazi dei colori srgb-linear e display-p3-linear

Con l'aggiunta degli spazi dei colori predefiniti "srgb-linear" e "display-p3-linear", il contesto canvas di WebGPU ora può eseguire il rendering direttamente negli spazi dei colori lineari con gamma estesa per supportare i display con gamma ampia. Questi spazi dei colori mantengono una relazione lineare tra i valori dei pixel e la luminanza fisica. Ciò li rende ideali per il rendering della luce fisica nei giochi e per attività di elaborazione spaziale come anti-aliasing, interpolazione e decimazione. Consulta l'intent to ship e la PR #574 di esempio di Particles (HDR).

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",
});

Formato di vertice snorm10-10-10-2 aggiuntivo

Il formato vertex "snorm10-10-10-2" è un formato a 32 bit compresso che contiene quattro valori normalizzati con segno: tre componenti a 10 bit (r, g, b) e un componente a 2 bit (a). Con questo formato, puoi archiviare in modo efficiente attributi, come vettori normali 3D con uno scalare aggiuntivo a 2 bit o un flag di allineamento, risparmiando al contempo larghezza di banda della memoria. Consulta la specifica PR 6491.

Supporto di f16 su Linux per NVIDIA

La funzionalità facoltativa "shader-f16", che fornisce il supporto per i valori in rappresentazione in virgola mobile a 16 bit in WGSL, è ora supportata su Linux per i driver GPU NVIDIA recenti. Consulta il problema chromium:42251215.

Aggiornamenti di Dawn

Ora puoi eseguire query sul LUID del DXGIAdapter sottostante per un determinato adattatore GPU utilizzando la struttura WGPUAdapterPropertiesD3D. Consulta il problema chromium:562849566.

Questi sono alcuni dei punti salienti. Consulta l'elenco completo dei commit.

Novità di WebGPU

Un elenco di tutti gli argomenti trattati nella serie Novità di WebGPU.

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