Novità di WebGPU (Chrome 129)

François Beaufort
François Beaufort

Supporto HDR con modalità di mappatura della tonalità della tela

Gli sviluppatori web hanno opzioni limitate per la distribuzione di contenuti HDR, basandosi principalmente sugli elementi <img> e <video>. L'elemento <canvas>, tuttavia, rimane limitato all'SDR. La generazione di contenuti HDR dinamici all'interno di un canvas richiede la codifica dei contenuti come immagine HDR prima della visualizzazione (per un esempio, vedi questa demo).

Il nuovo parametro GPUCanvasToneMappingMode nella configurazione del canvas WebGPU ora consente a WebGPU di disegnare colori più luminosi del bianco (#FFFFFF). Ciò avviene tramite le seguenti modalità:

  • "standard": Il comportamento predefinito limita i contenuti all'intervallo SDR dello schermo. Questa modalità si ottiene bloccando tutti i valori di colore nello spazio colore dello schermo all'intervallo [0, 1].

  • "extended": Sblocca l'intera gamma HDR dello schermo. Questa modalità corrisponde a "standard" nell'intervallo [0, 1] dello schermo. Il clamping o la proiezione viene eseguito sulla gamma dinamica estesa dello schermo, ma non su [0, 1].

Il seguente snippet di codice mostra come configurare un canvas per l'High Dynamic Range.

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",
  toneMapping: { mode: "extended" },
});

Esplora l'HDR con WebGPU consultando l'esempio di particelle (HDR) e l'esempio di HDR WebGPU e consulta la voce di chromestatus.

Un laptop con uno schermo HDR che mostra un&#39;immagine dai colori vivaci.
Il campione Particelle (HDR) visualizzato su uno schermo HDR.

Supporto esteso per i sottogruppi

A seguito dell'annuncio della sperimentazione dei sottogruppi, le funzioni integrate dei sottogruppi sono ora disponibili per l'utilizzo sia negli shader di calcolo che negli shader di frammenti. Non sono più limitati solo agli shader di calcolo. Vedi problema 354738715.

Tieni presente che il valore incorporato subgroup_size è attualmente buggy negli shader di frammenti. Evitalo per ora.

Inoltre, sono state aggiunte le seguenti funzioni integrate per i sottogruppi:

  • subgroupAdd(value): restituisce la somma di tutte le chiamate attive value nel sottogruppo.
  • subgroupExclusiveAdd(value): restituisce la somma esclusiva delle scansioni di tutte le chiamate attive value nel sottogruppo.
  • subgroupMul(value): restituisce la moltiplicazione di tutte le invocazioni attive value nel sottogruppo.
  • subgroupExclusiveMul(value): restituisce la moltiplicazione esclusiva della scansione di tutte le chiamate attive value nel sottogruppo.

  • subgroupAnd(value): Restituisce l'operatore AND binario di tutte le invocazioni attive value nel sottogruppo.
  • subgroupOr(value): Restituisce l'OR binario di tutte le invocazioni attive value nel sottogruppo.
  • subgroupXor(value): restituisce l'XOR binario di tutte le chiamate attive value nel sottogruppo.

  • subgroupMin(value): Restituisce il valore minimo di tutte le invocazioni attive value nel sottogruppo.
  • subgroupMax(value): Restituisce il valore massimo di tutte le chiamate attive value nel sottogruppo.

  • subgroupAll(value): restituisce true se value è true per tutte le chiamate attive nel sottogruppo.
  • subgroupAny(value): restituisce true se value è true per qualsiasi chiamata attiva nel sottogruppo.

  • subgroupElect(): restituisce il valore True se questa chiamata ha il valore subgroup_invocation_id più basso tra le chiamate attive nel sottogruppo.
  • subgroupBroadcastFirst(value): trasmette value dall'invocazione attiva con il subgroup_invocation_id più basso nel sottogruppo a tutte le altre invocazioni attive.

  • subgroupShuffle(value, id): restituisce value dalla chiamata attiva il cui subgroup_invocation_id corrisponde a id.
  • subgroupShuffleXor(value, mask): restituisce value dalla chiamata attiva il cui subgroup_invocation_id corrisponde a subgroup_invocation_id ^ mask. mask deve essere uniformemente dinamico.
  • subgroupShuffleUp(value, delta): restituisce value dalla chiamata attiva il cui subgroup_invocation_id corrisponde a subgroup_invocation_id - delta.
  • subgroupShuffleDown(value, delta): restituisce value dalla chiamata attiva il cui subgroup_invocation_id corrisponde a subgroup_invocation_id + delta.

  • quadBroadcast(value, id): Trasmissioni value dall'invocazione del quadrante con ID uguale a id. id deve essere un'espressione costante.
  • quadSwapX(value): Scambia value tra le invocazioni nel quad nella direzione X.
  • quadSwapY(value): scambia value tra le invocazioni nel quadrante nella direzione Y.
  • quadSwapDiagonal(value): Scambi value tra chiamate nel quadrante in diagonale.

Aggiornamenti all'alba

La struttura wgpu::PrimitiveState ora include direttamente l'impostazione di controllo del clipping della profondità, eliminando la necessità di una struttura wgpu::PrimitiveDepthClipControl separata. Per scoprire di più, consulta il seguente snippet di codice e la PR webgpu-headers.

// Before
wgpu::PrimitiveState primitive = {};
wgpu::PrimitiveDepthClipControl depthClipControl;
depthClipControl.unclippedDepth = true;
primitive.nextInChain = &depthClipControl;
// Now
wgpu::PrimitiveState primitive = {};
primitive.unclippedDepth = true;

Questi sono solo 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 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