Wat is er nieuw in WebGPU (Chrome 131)

François Beaufort
François Beaufort

Clipafstanden in WGSL

Met clipafstanden kunt u het clipvolume van primitieven beperken met door de gebruiker gedefinieerde halve spaties in de uitvoer van het hoekpuntstadium. Door uw eigen knipvlakken te definiëren, krijgt u meer controle over wat zichtbaar is in uw WebGPU-scènes. Deze techniek is vooral handig voor toepassingen zoals CAD-software, waarbij nauwkeurige controle over de visualisatie cruciaal is.

Wanneer de functie "clip-distances" beschikbaar is in een GPUAdapter, vraag dan een GPUDevice met deze functie aan om ondersteuning voor clipafstanden te krijgen in WGSL, en schakel deze extensie expliciet in uw WGSL-code in met enable clip_distances; . Eenmaal ingeschakeld, kunt u de ingebouwde array clip_distances in uw hoekpuntshader gebruiken. Deze array bevat afstanden tot een door de gebruiker gedefinieerd kijkvlak:

  • Een clipafstand van 0 betekent dat het hoekpunt in het vlak ligt.
  • Een positieve afstand betekent dat het hoekpunt zich binnen de halve ruimte van de clip bevindt (de zijde die u wilt behouden).
  • Een negatieve afstand betekent dat het hoekpunt zich buiten de halve ruimte van de clip bevindt (de zijde die u wilt weggooien).

Zie het volgende fragment, de chromestatus-invoer en probleem 358408571 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
  throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
  requiredFeatures: ["clip-distances"],
});

const vertexShaderModule = device.createShaderModule({ code: `
  enable clip_distances;

  struct VertexOut {
    @builtin(clip_distances) my_clip_distances : array<f32, 1>,
    @builtin(position) my_position : vec4f,
  }
  @vertex fn main() -> VertexOut {
    var output : VertexOut;
    output.my_clip_distances[0] = 1;
    output.my_position = vec4f(0, 0, 0, 1);
    return output;
  }
`,
});

// Send the appropriate commands to the GPU...

GPUCanvasContext getConfiguration()

Zodra GPUCanvasContext configure() is aangeroepen met een configuratiewoordenboek, kunt u met de methode GPUCanvasContext getConfiguration() de canvascontextconfiguratie controleren. Het omvat device , format , usage , viewFormats , colorSpace , toneMapping en alphaMode leden. Dit is handig voor taken zoals controleren of de browser HDR-canvas ondersteunt, zoals weergegeven in het Particles (HDR)-voorbeeld . Zie het volgende fragment, de chromestatus-invoer en uitgave 370109829 .

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

// Configure the canvas for HDR.
context.configure({
  device,
  format: "rgba16float",
  toneMapping: { mode: "extended" },
});

const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
  // The browser supports HDR canvas.
  // Warning! The user still needs a HDR display to enjoy HDR content.
}

Punt- en lijnprimitieven mogen geen diepteafwijking hebben

Zoals eerder aangekondigd, maakt de WebGPU-specificatie er nu een validatiefout van om depthBias , depthBiasSlopeScale en depthBiasClamp in te stellen op een waarde die niet nul is wanneer de topologie voor een renderpijplijn een lijn- of punttype is. Zie uitgave 352567424 .

Inclusief ingebouwde scanfuncties voor subgroepen

Als onderdeel van het experimenteren met subgroepen zijn de volgende ingebouwde functies voor subgroepen toegevoegd in uitgave 361330160 :

  • subgroupInclusiveAdd(value) : Retourneert de inclusieve scansom van alle actieve value in de subgroep.
  • subgroupInclusiveMul(value) : Retourneert de inclusieve scanvermenigvuldiging van alle actieve value in de subgroep.

Experimentele ondersteuning voor indirecte meertrekking

Met de indirecte GPU-functie voor meerdere trekkingen kunt u meerdere trekkingsoproepen uitvoeren met één enkele GPU-opdracht. Dit is met name handig in situaties waarin een groot aantal objecten moet worden weergegeven, zoals deeltjessystemen, instances en grote scènes. De methoden drawIndirect() en drawIndexedIndirect() GPURenderPassEncoder kunnen slechts één draw-aanroep tegelijk uitvoeren vanuit een bepaald gebied van een GPU-buffer.

Totdat deze experimentele functie is gestandaardiseerd , schakelt u de vlag 'Onveilige WebGPU-ondersteuning' in op chrome://flags/#enable-unsafe-webgpu om deze beschikbaar te maken in Chrome.

Omdat de niet-standaard GPU-functie "chromium-experimental-multi-draw-indirect" beschikbaar is in een GPUAdapter, kunt u een GPUDevice met deze functie aanvragen. Maak vervolgens een GPUBuffer met het GPUBufferUsage.INDIRECT -gebruik om de tekenaanroepen op te slaan. U kunt het later gebruiken in de nieuwe methoden multiDrawIndirect() en multiDrawIndexedIndirect() GPURenderPassEncoder om draw-aanroepen uit te voeren binnen een render-pass. Zie het volgende fragment en probleem 356461286 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
  throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});

// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
  3, 1, 0, 0, // First draw call
  3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
  size: drawData.byteLength,
  usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);

// Create a render pipeline, a vertex buffer, and a render pass encoder...

// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();

Compilatieoptie Shader-module strikte wiskunde

Er is een booleaanse strictMath ontwikkelaarsoptie toegevoegd aan GPUShaderModuleDescriptor waarmee u strikte wiskunde kunt in- of uitschakelen tijdens het compileren van de shader-module. Het is beschikbaar achter de vlag "WebGPU Developer Features" op chrome://flags/#enable-webgpu-developer-features , wat betekent dat het een functie is die alleen bedoeld is voor gebruik tijdens de ontwikkeling. Zie uitgave 42241455 .

Deze optie wordt momenteel ondersteund op Metal en Direct3D. Wanneer strikte wiskunde is uitgeschakeld, kan de compiler uw shaders optimaliseren door:

  • Het negeren van de mogelijkheid van NaN- en Infinity-waarden.
  • Behandel -0 als +0.
  • Vervanging van deling door snellere vermenigvuldiging met het omgekeerde.
  • Bewerkingen herschikken op basis van associatieve en distributieve eigenschappen.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

GPUAdapter requestAdapterInfo() verwijderen

De asynchrone methode GPUAdapter requestAdapterInfo() is overbodig omdat u GPUAdapterInfo al synchroon kunt ophalen met behulp van het GPUAdapter info -kenmerk. Daarom is de niet-standaard GPUAdapter requestAdapterInfo() -methode nu verwijderd. Zie de intentie om te verwijderen .

Dawn-updates

Het uitvoerbare bestand tint_benchmark meet de kosten van het vertalen van shaders van WGSL naar elke backend-taal. Bekijk de nieuwe documentatie voor meer informatie.

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

Wat is er nieuw in WebGPU

Een lijst met alles wat aan bod komt in de What's New in WebGPU -serie.

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