Wat is er nieuw in WebGPU (Chrome 129)

François Beaufort
François Beaufort

HDR-ondersteuning met canvas-toonmappingmodus

Webontwikkelaars hebben beperkte mogelijkheden om HDR-content weer te geven en zijn voornamelijk aangewezen 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 eerst als HDR-afbeelding worden gecodeerd voordat deze wordt weergegeven (zie deze demo voor een voorbeeld).

De nieuwe parameter GPUCanvasToneMappingMode in de WebGPU-canvasconfiguratie maakt het nu mogelijk voor WebGPU om kleuren te tekenen die helderder zijn dan wit ( #FFFFFF ). Dit gebeurt via de volgende modi:

  • "standard" : De standaardinstelling 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 bereik [0, 1] van het scherm. De belichting of projectie gebeurt binnen het uitgebreide dynamische bereik van het scherm, maar niet binnen [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 de Particles (HDR)-voorbeeldapplicatie en het WebGPU HDR-voorbeeld te bekijken, en raadpleeg de chromestatus-pagina .

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

Uitgebreide subgroepen ondersteunen

Na de aankondiging van de experimenten met subgroepen zijn de ingebouwde functies voor subgroepen 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 een bug bevat in fragmentshaders. Vermijd deze voorlopig.

Daarnaast zijn de volgende ingebouwde subgroepfuncties toegevoegd:

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

  • subgroupAnd(value) : Retourneert de binaire EN-bewerking van alle actieve value binnen de subgroep.
  • subgroupOr(value) : Retourneert de binaire OF van alle actieve value binnen de subgroep.
  • subgroupXor(value) : Retourneert de binaire XOR van alle actieve value binnen de subgroep.

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

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

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

  • subgroupShuffle(value, id) : Retourneert value van de actieve aanroep waarvan subgroup_invocation_id overeenkomt met 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 met subgroup_invocation_id - delta .
  • subgroupShuffleDown(value, delta) : Retourneert value van de actieve aanroep waarvan subgroup_invocation_id overeenkomt met 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 de quad in de X-richting.
  • quadSwapY(value) : Wisselt value tussen aanroepen in de quad in de Y-richting.
  • quadSwapDiagonal(value) : Wisselt value tussen aanroepen in de vierhoek diagonaal.

Dawn-updates

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

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

Dit is slechts een greep uit de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU?

Een lijst van alles wat in de serie ' Wat is nieuw in WebGPU' aan bod is gekomen.

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