Nieuw in WebGPU (Chrome 155-156)

WGSL-extensie fragment_depth

Bij renderpasses met veel geometrie zijn vroege Z-optimalisaties de beste vriend van ontwikkelaars. Ze bieden een enorme prestatieboost doordat de GPU verborgen pixels kan verwijderen voordat dure fragment shaders worden uitgevoerd. Als een gerasterde diepte niet door de dieptetest komt, slaat de GPU de fragment-shader helemaal over, op voorwaarde dat de shader geen andere neveneffecten heeft.

Als je wilt weten hoe hardware dit afhandelt, heeft MJP een uitstekend artikel geschreven over When Does Early-Z Have to be Disabled? (Wanneer moet Early-Z worden uitgezet?).

Hoewel aangepaste dieptemanipulatie handig is, heeft dit een verborgen nadeel als je dit in je fragmentshader doet. Als je naar @builtin(frag_depth) schrijft in een fragmentshader, worden stuurprogramma's meestal gedwongen deze vroege Z-optimalisaties uit te zetten voor de hele tekenaanroep. Dit komt omdat de heuristiek van de driver niet kan garanderen dat de berekende uitvoerdiepte van de shader overeenkomt met de diepte die door de rasterizer wordt geïnterpoleerd.

Om deze prestatievermindering op te lossen, kun je met de WGSL-extensie fragment_depth een less- of greater-dieptemodusnaam op @builtin(frag_depth) specificeren om expliciet aan te geven hoe de geschreven diepte zich verhoudt tot de geïnterpoleerde diepte. Zo kan de GPU veilig vroege Z-optimalisaties toepassen.

Deze taalexensie kan in JavaScript worden gedetecteerd met navigator.gpu.wgslLanguageFeatures. We raden je aan een requires-richtlijn te gebruiken om de mogelijkheid van niet-overdraagbaarheid aan te geven met requires fragment_depth; bovenaan je WGSL-shadercode. Neem het volgende voorbeeld en de intentie om te verzenden door.

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

Textuurcompressie niet uitgelijnd

Met de GPU-functie texture-compression-unaligned kunnen gecomprimeerde texturen worden gemaakt met afmetingen die geen gehele veelvouden van de blokgrootte zijn (zoals 4x4 voor BC-, ETC2- en ASTC-indelingen). Eerder vereiste WebGPU strikt dat textuurgrootten overeenkomen met deze blokgrenzen. Doordat je geen texturen hoeft op te vullen of te schalen om ze aan te passen aan blokuitlijningen, behoudt deze functie de oorspronkelijke compressiekwaliteit zonder schaalvervorming te introduceren. Ga naar Verzendintentie.

Het volgende codefragment checkt of de adapter niet-uitgelijnde textuurcompressie ondersteunt en vraagt, indien beschikbaar, een apparaat met deze functie aan.

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

Veel dank aan externe bijdrager Ignacio Castaño voor het ontwikkelen van deze functie.

Kleurruimten srgb-lineair en display-p3-lineair

Met de toevoeging van de vooraf gedefinieerde kleurruimten srgb-linear en display-p3-linear kan de WebGPU-canvascontext nu rechtstreeks worden gerenderd in lineaire kleurruimten met een uitgebreid bereik om schermen met een breed kleurengamma te ondersteunen. Deze kleurruimten hebben een lineaire relatie tussen pixelwaarden en fysieke luminantie. Dit maakt ze ideaal voor fysieke lichtweergave in games en voor ruimtelijke verwerkingstaken zoals anti-aliasing, interpolatie en decimatie. Ga naar de intentie om te verzenden en de voorbeeld-PR #574 voor deeltjes (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",
});

Aanvullende hoekpuntindeling snorm10-10-10-2

De hoekpuntindeling snorm10-10-10-2 is een verpakte 32-bits indeling met 4 ondertekende genormaliseerde waarden: 3 componenten van 10 bits (r, g, b) en 1 component van 2 bits (a). Met deze indeling kun je kenmerken efficiënt opslaan, zoals 3D-normaalvectoren met een extra 2-bits scalair of een uitlijningsvlag, terwijl je geheugenbandbreedte bespaart. Ga naar spec PR 6491.

f16-ondersteuning op Linux voor NVIDIA

De optionele functie shader-f16, die ondersteuning biedt voor 16-bits zwevende-kommawaarden in WGSL, wordt nu ondersteund op Linux voor recente NVIDIA-GPU-stuurprogramma's. Ga naar issue chromium:42251215.

Updates voor Dawn

U kunt nu de LUID van de onderliggende DXGIAdapter voor een bepaalde GPU-adapter opvragen met de WGPUAdapterPropertiesD3D-structuur. Ga naar issue chromium:562849566.

Dit zijn enkele van de belangrijkste punten. Neem de uitgebreide lijst met doorvoeringen door.

Wat is er nieuw in WebGPU?

Een lijst met alles wat is behandeld in de serie Nieuw in 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