Clipafstanden in WGSL
Met clipafstanden kunt u het clipvolume van primitieven beperken met door de gebruiker gedefinieerde halve ruimtes in de uitvoer van de vertexstage. Het definiëren van uw eigen clipvlakken geeft u meer controle over wat er zichtbaar is in uw WebGPU-scènes. Deze techniek is met name handig voor toepassingen zoals CAD-software, waar 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 clip-distances in WGSL te krijgen en schakel deze extensie expliciet in uw WGSL-code in met enable clip_distances;
Zodra deze functie is ingeschakeld, kunt u de ingebouwde clip_distances
-array in uw vertexshader gebruiken. Deze array bevat afstanden tot een door de gebruiker gedefinieerd clipvlak:
- Een clipafstand van 0 betekent dat het hoekpunt op het vlak ligt.
- Een positieve afstand betekent dat het hoekpunt zich binnen de halve clipruimte bevindt (de zijde die u wilt behouden).
- Een negatieve afstand betekent dat het hoekpunt zich buiten de halve clipruimte 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()
Nadat GPUCanvasContext configure()
is aangeroepen met een configuratiewoordenboek, kunt u met de GPUCanvasContext getConfiguration()
methode de configuratie van de canvascontext controleren. Deze bevat de leden device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
en alphaMode
. Dit is handig voor taken zoals het controleren of de browser HDR-canvas ondersteunt, zoals getoond in het voorbeeld van Particles (HDR) . Zie het volgende fragment, de vermelding chromestatus en issue 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 dieptebias hebben
Zoals eerder aangekondigd, is het volgens de WebGPU-specificatie nu een validatiefout om depthBias
, depthBiasSlopeScale
en depthBiasClamp
in te stellen op een waarde anders dan nul wanneer de topologie voor een renderpijplijn een lijn- of punttype is. Zie probleem 352567424 .
Inclusief ingebouwde scanfuncties voor subgroepen
Als onderdeel van het experimenteren met subgroepen zijn de volgende ingebouwde subgroepfuncties 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 multi-draw indirect
Met de indirecte GPU-functie met meerdere draws kunt u meerdere draw-aanroepen uitvoeren met één GPU-opdracht. Dit is met name handig in situaties waarin een groot aantal objecten moet worden gerenderd, zoals deeltjessystemen, instancing en grote scènes. De GPURenderPassEncoder-methoden drawIndirect()
en drawIndexedIndirect()
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 "Unsafe WebGPU Support" in op chrome://flags/#enable-unsafe-webgpu
om de functie beschikbaar te maken in Chrome.
Met 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 draw-aanroepen op te slaan. U kunt dit later gebruiken in de nieuwe GPURenderPassEncoder-methoden multiDrawIndirect()
en multiDrawIndexedIndirect()
om draw-aanroepen binnen een renderpass uit te voeren. Zie het volgende fragment en issue 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();
Shadermodule compilatieoptie strikte wiskunde
Er is een Booleaanse strictMath
ontwikkelaarsoptie toegevoegd aan GPUShaderModuleDescriptor waarmee u strict math kunt in- of uitschakelen tijdens de compilatie van shadermodules. Deze optie is beschikbaar achter de vlag "WebGPU Developer Features" op chrome://flags/#enable-webgpu-developer-features
, wat betekent dat deze functie alleen bedoeld is voor gebruik tijdens de ontwikkeling. Zie probleem 42241455 .
Deze optie wordt momenteel ondersteund op Metal en Direct3D. Wanneer strict math is uitgeschakeld, kan de compiler uw shaders optimaliseren door:
- De mogelijkheid van NaN- en Infinity-waarden wordt buiten beschouwing gelaten.
- -0 behandelen als +0.
- Vervang deling door snellere vermenigvuldiging met het omgekeerde.
- Het herschikken van bewerkingen 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 attribuut GPUAdapter info
. 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 voor 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 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 138
- Afkorting voor het gebruik van buffer als bindingsbron
- Wijzigingen in de groottevereisten voor buffers die bij het aanmaken in kaart zijn gebracht
- Architectuurrapport voor recente GPU's
- Verouder GPUAdapter isFallbackAdapter-kenmerk
- Dawn-updates
Chroom 137
- Gebruik textuurweergave voor externe textuurbinding
- Buffers kopiëren zonder offsets en grootte op te geven
- WGSL-werkgroepUniformLoad met behulp van een pointer naar atomaire
- GPUAdapterInfo powerPreference-kenmerk
- GPURequestAdapterOptions compatibilityMode-kenmerk verwijderen
- Dawn-updates
Chroom 136
- GPUAdapterInfo isFallbackAdapter-kenmerk
- Verbeteringen in de shadercompilatietijd op D3D12
- Canvasafbeeldingen opslaan en kopiëren
- Beperkingen voor de liftcompatibiliteitsmodus
- Dawn-updates
Chroom 135
- Het maken van een pijplijnlayout met een lay-out voor nulbindingsgroepen toestaan
- Laat viewports zich uitstrekken voorbij de grenzen van de renderdoelen
- Gemakkelijkere toegang tot de experimentele compatibiliteitsmodus op Android
- Verwijder maxInterStageShaderComponents-limiet
- Dawn-updates
Chroom 134
- Verbeter machine learning-workloads met subgroepen
- Verwijder float-filterbare textuurtypen als ondersteuning voor mengbaar
- Dawn-updates
Chroom 133
- Extra unorm8x4-bgra en 1-component vertex-formaten
- Toestaan dat onbekende limieten worden aangevraagd met een ongedefinieerde waarde
- Wijzigingen in de WGSL-uitlijningsregels
- WGSL-prestatiewinst met weggooien
- Gebruik VideoFrame displaySize voor externe texturen
- Verwerk afbeeldingen met niet-standaardoriëntaties met copyExternalImageToTexture
- Verbetering van de ontwikkelaarservaring
- Compatibiliteitsmodus inschakelen met featureLevel
- Opschonen van experimentele subgroepkenmerken
- Verouder maxInterStageShaderComponents-limiet
- Dawn-updates
Chroom 132
- Gebruik van textuurweergave
- 32-bits float-texturen mengen
- GPUDevice adapterInfo-kenmerk
- Het configureren van de canvascontext met een ongeldige indeling levert een JavaScript-fout op
- Filteren van samplerbeperkingen op texturen
- Uitgebreide subgroepsexperimenten
- Verbetering van de ontwikkelaarservaring
- Experimentele ondersteuning voor 16-bits genormaliseerde textuurformaten
- Dawn-updates
Chroom 131
- Clipafstanden in WGSL
- GPUCanvasContext getConfiguration()
- Punt- en lijnprimitieven mogen geen dieptebias hebben
- Inclusief ingebouwde scanfuncties voor subgroepen
- Experimentele ondersteuning voor multi-draw indirect
- Shadermodule compilatieoptie strikte wiskunde
- GPUAdapter requestAdapterInfo() verwijderen
- Dawn-updates
Chroom 130
- Menging van dubbele bronnen
- Verbeteringen in de shadercompilatietijd op Metal
- Veroudering van GPUAdapter requestAdapterInfo()
- Dawn-updates
Chroom 129
Chroom 128
- Experimenteren met subgroepen
- Verouder het instellen van dieptebias voor lijnen en punten
- Verberg niet-vastgelegde fout DevTools-waarschuwing als preventDefault
- WGSL interpoleert eerst de bemonstering en
- Dawn-updates
Chroom 127
- Experimentele ondersteuning voor OpenGL ES op Android
- GPUAdapter info-kenmerk
- Verbeteringen in WebAssembly-interoperabiliteit
- Verbeterde commando-encoderfouten
- Dawn-updates
Chroom 126
- Verhoog de maxTextureArrayLayers-limiet
- Bufferuploadoptimalisatie voor Vulkan-backend
- Verbeteringen in de compilatietijd van shaders
- Ingediende opdrachtbuffers moeten uniek zijn
- Dawn-updates
Chroom 125
Chroom 124
- Alleen-lezen en lees-schrijf opslagtexturen
- Ondersteuning van servicemedewerkers en gedeelde werknemers
- Nieuwe adapterinformatie-attributen
- Bugfixes
- Dawn-updates
Chroom 123
- Ondersteuning voor ingebouwde DP4a-functies in WGSL
- Onbeperkte pointerparameters in WGSL
- Syntaxissuiker voor het derefereren van composieten in WGSL
- Afzonderlijke alleen-lezenstatus 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 voor WebGPU op Android
- Gebruik DXC in plaats van FXC voor shadercompilatie op Windows
- Tijdstempelquery's in compute- en renderpassen
- Standaard toegangspunten tot shadermodules
- Ondersteuning display-p3 als GPUExternalTexture-kleurruimte
- Geheugenstapels info
- Dawn-updates
Chroom 120
- Ondersteuning voor 16-bits drijvende-kommawaarden in WGSL
- Verleg de grenzen
- Wijzigingen in de dieptestencilstatus
- Adapterinformatie-updates
- Kwantificering van tijdstempelquery's
- Voorjaarsschoonmaak
Chroom 119
- Filterbare 32-bits float-texturen
- unorm10-10-10-2 vertex-formaat
- 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
- Vertexbuffer ongedaan maken
- Bindgroep ongedaan maken
- Fouten bij het maken van een asynchrone pijplijn uitschakelen wanneer het apparaat verloren is gegaan
- Updates voor het maken van SPIR-V-shadermodules
- Verbetering van de ontwikkelaarservaring
- Caching-pipelines met automatisch gegenereerde lay-out
- Dawn-updates
Chroom 116
- WebCodecs-integratie
- Verloren apparaat geretourneerd door GPUAdapter
requestDevice()
- Zorg ervoor dat de videoweergave vloeiend blijft als
importExternalTexture()
wordt aangeroepen - Specificatieconformiteit
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 115
- Ondersteunde WGSL-taalextensies
- Experimentele ondersteuning voor Direct3D 11
- Standaard discrete GPU op netstroom
- Verbetering van de ontwikkelaarservaring
- Dawn-updates
Chroom 114
- JavaScript optimaliseren
- getCurrentTexture() op een niet-geconfigureerd canvas genereert InvalidStateError
- WGSL-updates
- Dawn-updates