Wat is er nieuw in WebGPU (Chrome 129)

François Beaufort
François Beaufort

HDR-ondersteuning met canvas-toonmappingmodus

Webontwikkelaars hebben beperkte mogelijkheden voor het leveren van HDR-content en vertrouwen voornamelijk op <img> en <video> -elementen. Het <canvas> -element blijft echter beperkt tot SDR. Om dynamische HDR-content binnen een canvas te genereren, moet de inhoud ervan worden gecodeerd als een HDR-afbeelding voordat deze kan worden weergegeven (zie deze demo voor een voorbeeld).

De nieuwe GPUCanvasToneMappingMode -parameter in de WebGPU-canvasconfiguratie stelt WebGPU nu in staat om kleuren helderder dan wit te tekenen ( #FFFFFF ). Dit gebeurt via de volgende modi:

  • "standard" : Het standaardgedrag beperkt de inhoud tot het SDR-bereik van het scherm. Deze modus wordt bereikt door alle kleurwaarden in de kleurruimte van het scherm te beperken tot het interval [0, 1] .

  • "extended" : ontgrendelt het volledige HDR-bereik van het scherm. Deze modus komt overeen met "standard" in het [0, 1] -bereik van het scherm. Klemmen of projecteren gebeurt op het uitgebreide dynamische bereik van het scherm, maar niet op [0, 1] .

Het volgende codefragment laat zien hoe u een canvas configureert voor een hoog dynamisch bereik.

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

Ontdek HDR met WebGPU door het Particles (HDR)-voorbeeld en WebGPU HDR-voorbeeld te bekijken en bekijk de vermelding chromestatus .

Een laptop met een HDR-scherm dat een levendig beeld weergeeft.
Het deeltjesmonster (HDR) wordt weergegeven op een HDR-scherm.

Uitgebreide subgroepenondersteuning

Na de aankondiging van de experimenten met subgroepen zijn de ingebouwde subgroepfuncties nu beschikbaar voor gebruik in zowel compute shaders als fragment shaders. Ze zijn niet langer beperkt tot alleen compute shaders. Zie issue 354738715 .

Houd er rekening mee dat de ingebouwde waarde subgroup_size momenteel buggy is in fragment shaders. Vermijd dit voorlopig.

Verder zijn de volgende subgroep ingebouwde functies toegevoegd:

  • subgroupAdd(value) : Retourneert de som van alle actieve value in de subgroep.
  • subgroupExclusiveAdd(value) : Retourneert de exclusieve scansom van alle actieve value in de subgroep.
  • subgroupMul(value) : Retourneert de vermenigvuldiging van alle actieve value in de subgroep.
  • subgroupExclusiveMul(value) : Retourneert de exclusieve scanvermenigvuldiging van alle actieve value in de subgroep.

  • subgroupAnd(value) : retourneert de binaire AND van alle actieve value in de subgroep.
  • subgroupOr(value) : Retourneert de binaire OF van alle actieve value in de subgroep.
  • subgroupXor(value) : retourneert de binaire XOR van alle actieve value in de subgroep.

  • subgroupMin(value) : Retourneert de minimale waarde van alle actieve value in de subgroep.
  • subgroupMax(value) : Retourneert de maximale waarde van alle actieve value in de subgroep.

  • subgroupAll(value) : Retourneert true als value true is voor alle actieve aanroepen in de subgroep.
  • subgroupAny(value) : Retourneert true als value true is voor een actieve aanroep in de subgroep.

  • subgroupElect() : Retourneert true als deze aanroep de laagste subgroup_invocation_id heeft van alle actieve aanroepen in de subgroep.
  • subgroupBroadcastFirst(value) : Verzendt value van de actieve aanroep met de laagste subgroup_invocation_id in de subgroep naar alle andere actieve aanroepen.

  • subgroupShuffle(value, id) : Retourneert value van de actieve aanroep waarvan subgroup_invocation_id overeenkomt id .
  • subgroupShuffleXor(value, mask) : retourneert value van de actieve aanroep waarvan subgroup_invocation_id overeenkomt met subgroup_invocation_id ^ mask . mask moet dynamisch uniform zijn.
  • subgroupShuffleUp(value, delta) : Retourneert value van de actieve aanroep waarvan subgroup_invocation_id overeenkomt subgroup_invocation_id - delta .
  • subgroupShuffleDown(value, delta) : Retourneert value van de actieve aanroep waarvan subgroup_invocation_id overeenkomt subgroup_invocation_id + delta .

  • quadBroadcast(value, id) : Zendt value uit van de quad-aanroep met id gelijk aan id . id moet een constante-expressie zijn.
  • quadSwapX(value) : Wisselt value tussen aanroepen in het quad in de X-richting.
  • quadSwapY(value) : wisselt value tussen aanroepen in het quad in de Y-richting.
  • quadSwapDiagonal(value) : Wisselt value diagonaal tussen aanroepen in het vierkant.

Dawn-updates

De struct wgpu::PrimitiveState bevat nu direct de instelling voor diepte-clipcontrole, waardoor een aparte struct wgpu::PrimitiveDepthClipControl niet meer nodig is. Zie het volgende codefragment en de webgpu-headers PR voor meer informatie.

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

Dit behandelt slechts enkele van de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU

Een lijst met alles wat in de serie Wat is er nieuw in WebGPU is behandeld.

Chroom 140

Chroom 139

Chroom 138

Chroom 137

Chroom 136

Chroom 135

Chroom 134

Chroom 133

Chroom 132

Chroom 131

Chroom 130

Chroom 129

Chroom 128

Chroom 127

Chroom 126

Chroom 125

Chroom 124

Chroom 123

Chroom 122

Chroom 121

Chroom 120

Chroom 119

Chroom 118

Chroom 117

Chroom 116

Chroom 115

Chroom 114

Chroom 113