Distanze dei clip in WGSL
Le distanze di clip ti consentono di limitare il volume del clip delle primitive con semispazi definiti dall'utente nell'output della fase dei vertici. La definizione di piani di ritaglio personalizzati ti offre un maggiore controllo su ciò che è visibile nelle scene WebGPU. Questa tecnica è particolarmente utile per applicazioni come il software CAD, in cui è fondamentale un controllo preciso della visualizzazione.
Quando la funzionalità "clip-distances"
è disponibile in un GPUAdapter, richiedi un GPUDevice con questa funzionalità per ottenere il supporto delle distanze di clip in WGSL e abilita esplicitamente questa estensione nel codice WGSL con enable clip_distances;
. Una volta attivato, puoi utilizzare l'array integrato clip_distances
nel tuo vertex shader. Questo array contiene le distanze da un piano di taglio definito dall'utente:
- Una distanza di clip pari a 0 indica che il vertice si trova sul piano.
- Una distanza positiva indica che il vertice si trova all'interno del semispazio del clip (il lato che vuoi conservare).
- Una distanza negativa indica che il vertice si trova al di fuori del semispazio del clip (il lato che vuoi eliminare).
Consulta lo snippet seguente, la voce di chromestatus e il problema 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()
Una volta chiamato GPUCanvasContext configure()
con un dizionario di configurazione, il metodo GPUCanvasContext getConfiguration()
ti consente di controllare la configurazione del contesto della tela. Sono inclusi i membri device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
e alphaMode
. Questo è utile per attività come verificare se il browser supporta la tela HDR, come mostrato nel Sample Particelle (HDR). Consulta lo snippet seguente, la voce di chromestatus e il problema 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.
}
Le primitive di punti e linee non devono avere bias di profondità
Come annunciato in precedenza, le specifiche WebGPU ora considerano un errore di convalida l'impostazione di depthBias
, depthBiasSlopeScale
e depthBiasClamp
su un valore diverso da zero quando la topologia di una pipeline di rendering è di tipo linea o punto. Vedi il problema 352567424.
Funzioni integrate di scansione inclusiva per i sottogruppi
Nell'ambito dell'esperimento sui sottogruppi, le seguenti funzioni predefinite dei sottogruppi sono state aggiunte nel problema 361330160:
subgroupInclusiveAdd(value)
: restituisce la sommatoria della scansione inclusiva di tutte le invocazioni attivevalue
nel sottogruppo.subgroupInclusiveMul(value)
: restituisce la moltiplicazione della scansione inclusiva di tutte le invocazioni attivevalue
nel sottogruppo.
Supporto sperimentale per l'indirizzamento multi-draw
La funzionalità GPU indiretta con più draw ti consente di emettere più chiamate draw con un singolo comando GPU. Questo è particolarmente utile in situazioni in cui è necessario eseguire il rendering di un numero elevato di oggetti, ad esempio sistemi di particelle, instanziazione e scene di grandi dimensioni. I metodi GPURenderPassEncoder drawIndirect()
e drawIndexedIndirect()
possono emettere una sola chiamata draw alla volta da una determinata regione di un buffer della GPU.
Fino a quando questa funzionalità sperimentale non sarà standardizzata, attiva il flag "Supporto WebGPU non sicuro" in chrome://flags/#enable-unsafe-webgpu
per renderla disponibile in Chrome.
Con la funzionalità GPU non standard "chromium-experimental-multi-draw-indirect"
disponibile in un GPUAdapter, richiedi un GPUDevice con questa funzionalità. Quindi crea un GPUBuffer con l'utilizzo GPUBufferUsage.INDIRECT
per memorizzare le chiamate draw. Puoi utilizzarlo in un secondo momento nei nuovi metodi GPURenderPassEncoder multiDrawIndirect()
e multiDrawIndexedIndirect()
per emettere chiamate draw all'interno di un passaggio di rendering. Consulta lo snippet seguente e il problema 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();
Opzione di compilazione del modulo shader matematica rigorosa
A GPUShaderModuleDescriptor è stata aggiunta un'opzione di sviluppatore booleana strictMath
per consentirti di attivare o disattivare la matematica rigorosa durante la compilazione del modulo shader. È disponibile dietro il flag "Funzionalità per sviluppatori WebGPU" in chrome://flags/#enable-webgpu-developer-features
, il che significa che è una funzionalità pensata solo per l'utilizzo durante lo sviluppo. Vedi issue 42241455.
Questa opzione è attualmente supportata su Metal e Direct3D. Quando la matematica rigorosa è disattivata, il compilatore potrebbe ottimizzare gli shader:
- Ignorando la possibilità di valori NaN e Infinity.
- Trattare -0 come +0.
- Sostituzione della divisione con la moltiplicazione più rapida per il reciproco.
- Riordinare le operazioni in base alle proprietà associative e distributive.
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 });
Rimuovi requestAdapterInfo() di GPUAdapter
Il metodo asincrono GPUAdapter requestAdapterInfo()
è ridondante perché puoi già ottenere GPUAdapterInfo in modo sincrono utilizzando l'attributo GPUAdapter info
. Di conseguenza, il metodo non standard GPUAdapter requestAdapterInfo()
è stato rimosso. Consulta l'intenzione di rimozione.
Aggiornamenti di Dawn
L'eseguibile tint_benchmark
misura il costo della traduzione degli shader da WGSL a ogni lingua di backend. Per saperne di più, consulta la nuova documentazione.
Sono riportati solo alcuni dei punti salienti. Consulta l'elenco completo dei commit.
Novità di WebGPU
Un elenco di tutto ciò che è stato trattato nella serie Novità di WebGPU.
Chrome 131
- Tagliare le distanze in WGSL
- GPUCanvasContext getConfiguration()
- Gli elementi primitivi punto e linea non devono avere bias di profondità
- Funzioni integrate di scansione inclusiva per i sottogruppi
- Supporto sperimentale per l'indirizzamento multi-draw
- Opzione di compilazione del modulo shader matematica rigorosa
- Rimuovi requestAdapterInfo() di GPUAdapter
- Aggiornamenti di Dawn
Chrome 130
- Combinazione di due origini
- Miglioramenti ai tempi di compilazione degli shader su Metal
- Obsoletezza di requestAdapterInfo() di GPUAdapter
- Aggiornamenti di Dawn
Chrome 129
- Supporto HDR con modalità di mappatura tonale della tela
- Supporto dei sottogruppi ampliato
- Aggiornamenti di Dawn
Chrome 128
- Sperimentazione con i sottogruppi
- Ritiro dell'impostazione della bias di profondità per linee e punti
- Nascondere l'avviso DevTools relativo a un errore non rilevato se preventDefault
- WGSL esegue prima l'interpolazione del campionamento e poi
- Aggiornamenti di Dawn
Chrome 127
- Supporto sperimentale per OpenGL ES su Android
- Attributo info di GPUAdapter
- Miglioramenti all'interoperabilità di WebAssembly
- Errori dell'encoder dei comandi migliorati
- Aggiornamenti di Dawn
Chrome 126
- Aumentare il limite di maxTextureArrayLayers
- Ottimizzazione del caricamento del buffer per il backend Vulkan
- Miglioramenti ai tempi di compilazione degli shader
- Gli spazi dei comandi inviati devono essere univoci
- Aggiornamenti di Dawn
Chrome 125
- Sottogruppi (funzionalità in fase di sviluppo)
- Eseguire il rendering di una sezione della texture 3D
- Aggiornamenti di Dawn
Chrome 124
- Texture di archiviazione di sola lettura e di lettura e scrittura
- Supporto di worker di servizio e worker condivisi
- Nuovi attributi delle informazioni sull'adattatore
- Correzioni di bug
- Aggiornamenti di Dawn
Chrome 123
- Supporto delle funzioni integrate DP4a in WGSL
- Parametri del cursore non soggetti a restrizioni in WGSL
- Sintassi alternativa per il dereferenziamento dei compositi in WGSL
- Stato di sola lettura separato per gli aspetti di stencil e profondità
- Aggiornamenti di Dawn
Chrome 122
- Ampliare la copertura con la modalità di compatibilità (funzionalità in fase di sviluppo)
- Aumentare il limite di maxVertexAttributes
- Aggiornamenti di Dawn
Chrome 121
- Supporto di WebGPU su Android
- Utilizzare DXC anziché FXC per la compilazione degli shader su Windows
- Query sui timestamp nei passaggi di calcolo e rendering
- Punti di contatto predefiniti per i moduli shader
- Supporto di display-p3 come spazio colore GPUExternalTexture
- Informazioni sugli heap di memoria
- Aggiornamenti di Dawn
Chrome 120
- Supporto dei valori in virgola mobile a 16 bit in WGSL
- Spingere i limiti al massimo
- Modifiche allo stato della maschera di profondità
- Aggiornamenti delle informazioni sugli adattatori
- Quantizzazione delle query sui timestamp
- Funzionalità per le pulizie di primavera
Chrome 119
- Texture con formato a virgola mobile 32 bit filtrabili
- Formato vertice unorm10-10-10-2
- Formato texture rgb10a2uint
- Aggiornamenti di Dawn
Chrome 118
- Supporto di HTMLImageElement e ImageData in
copyExternalImageToTexture()
- Supporto sperimentale per le texture di archiviazione in lettura/scrittura e di sola lettura
- Aggiornamenti di Dawn
Chrome 117
- Buffer di vertici non impostato
- Reimpostare il gruppo di associazione
- Ignorare gli errori della creazione della pipeline asincrona quando il dispositivo viene smarrito
- Aggiornamenti sulla creazione di moduli shader SPIR-V
- Miglioramento dell'esperienza degli sviluppatori
- Pipeline di memorizzazione nella cache con layout generato automaticamente
- Aggiornamenti di Dawn
Chrome 116
- Integrazione di WebCodecs
- Dispositivo smarrito restituito da GPUAdapter
requestDevice()
- Mantenere la riproduzione video fluida se viene chiamato
importExternalTexture()
- Conformità alle specifiche
- Miglioramento dell'esperienza degli sviluppatori
- Aggiornamenti di Dawn
Chrome 115
- Estensioni di lingua WGSL supportate
- Supporto sperimentale per Direct3D 11
- Ottenere una GPU discreta per impostazione predefinita con alimentazione CA
- Miglioramento dell'esperienza degli sviluppatori
- Aggiornamenti di Dawn
Chrome 114
- JavaScript di Optimize
- getCurrentTexture() su canvas non configurato genera un errore InvalidStateError
- Aggiornamenti WGSL
- Aggiornamenti di Dawn