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 actievevalue
in de subgroep. -
subgroupInclusiveMul(value)
: Retourneert de inclusieve scanvermenigvuldiging van alle actievevalue
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
- Clipafstanden in WGSL
- GPUCanvasContext getConfiguration()
- Punt- en lijnprimitieven mogen geen diepteafwijking hebben
- Inclusief ingebouwde scanfuncties voor subgroepen
- Experimentele ondersteuning voor indirecte meertrekking
- Compilatieoptie Shader-module strikte wiskunde
- GPUAdapter requestAdapterInfo() verwijderen
- Dawn-updates
Chroom 130
- Mengen met dubbele bron
- Verbeteringen in de compilatietijd van Shader op Metal
- Beëindiging van GPUAdapter requestAdapterInfo()
- Dawn-updates
Chroom 129
- HDR-ondersteuning met canvas tone mapping-modus
- Uitgebreide ondersteuning voor subgroepen
- Dawn-updates
Chroom 128
- Experimenteren met subgroepen
- Beëindig het instellen van diepteafwijking voor lijnen en punten
- Niet-vastgelegde fout verbergen DevTools-waarschuwing als preventieDefault
- WGSL interpoleert eerst de bemonstering en een van beide
- Dawn-updates
Chroom 127
- Experimentele ondersteuning voor OpenGL ES op Android
- GPUAdapter info-kenmerk
- Verbeteringen in de interoperabiliteit van WebAssembly
- Verbeterde opdracht-encoderfouten
- Dawn-updates
Chroom 126
- Verhoog de maxTextureArrayLayers-limiet
- Bufferuploadoptimalisatie voor Vulkan-backend
- Verbeteringen in de compilatietijd van Shader
- Ingezonden opdrachtbuffers moeten uniek zijn
- Dawn-updates
Chroom 125
Chroom 124
- Alleen-lezen en lezen-schrijven opslagtexturen
- Ondersteuning van servicemedewerkers en gedeelde medewerkers
- Nieuwe attributen voor adapterinformatie
- Bugfixes
- Dawn-updates
Chroom 123
- DP4a ingebouwde functies ondersteunen in WGSL
- Onbeperkte pointerparameters in WGSL
- Syntaxissuiker voor het derefereren van composieten in WGSL
- Afzonderlijke alleen-lezen-status voor stencil- en diepteaspecten
- Dawn-updates
Chroom 122
- Vergroot het bereik met de compatibiliteitsmodus (functie in ontwikkeling)
- Verhoog de maxVertexAttributes-limiet
- Dawn-updates
Chroom 121
- Ondersteuning WebGPU op Android
- Gebruik DXC in plaats van FXC voor shader-compilatie op Windows
- Tijdstempelquery's in reken- en renderpassen
- Standaardingangspunten voor shadermodules
- Ondersteuning display-p3 als GPUExternalTexture-kleurruimte
- Informatie over geheugenheaps
- Dawn-updates
Chroom 120
- Ondersteuning voor 16-bit drijvende-kommawaarden in WGSL
- Verleg de grenzen
- Veranderingen in de staat van de diepte-stencil
- Updates van adapterinformatie
- Kwantisering van tijdstempelquery's
- Lenteschoonmaakfuncties
Chroom 119
- Filterbare 32-bit float-texturen
- unorm10-10-10-2 hoekpuntformaat
- rgb10a2uint textuurformaat
- Dawn-updates
Chroom 118
- HTMLImageElement- en ImageData-ondersteuning in
copyExternalImageToTexture()
- Experimentele ondersteuning voor lees-schrijf- en alleen-lezen opslagtextuur
- Dawn-updates
Chroom 117
- Schakel hoekpuntbuffer uit
- Schakel de bindingsgroep uit
- Stil fouten bij het maken van asynchrone pijplijnen wanneer het apparaat verloren gaat
- Updates voor het maken van SPIR-V-shadermodules
- Verbetering van de ontwikkelaarservaring
- Caching van pijplijnen met automatisch gegenereerde lay-out
- Dawn-updates
Chroom 116
- WebCodecs-integratie
- Verloren apparaat geretourneerd door GPUAdapter
requestDevice()
- Houd het afspelen van video soepel als
importExternalTexture()
wordt aangeroepen - Spec-conformiteit
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 115
- Ondersteunde WGSL-taalextensies
- Experimentele ondersteuning voor Direct3D 11
- Krijg standaard een discrete GPU op wisselstroom
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 114
- Optimaliseer JavaScript
- getCurrentTexture() op een niet-geconfigureerd canvas genereert InvalidStateError
- WGSL-updates
- Dawn-updates