Cortar distâncias em WGSL
As distâncias de corte permitem restringir o volume de corte das primitivas com semiespaços definidos pelo usuário na saída da etapa de vértice. Definir seus próprios planos de recorte oferece mais controle sobre o que fica visível nas suas cenas da WebGPU. Essa técnica é particularmente útil para aplicativos como softwares de CAD, em que o controle preciso sobre a visualização é crucial.
Quando o recurso "clip-distances"
estiver disponível em um GPUAdapter, solicite um GPUDevice com esse recurso para receber suporte a distâncias de clipe no WGSL e ative explicitamente essa extensão no código do WGSL com enable clip_distances;
. Depois de ativar, você pode usar a matriz integrada clip_distances
no seu sombreador de vértice. Essa matriz contém distâncias para um plano de corte definido pelo usuário:
- Uma distância de corte de 0 significa que o vértice está no plano.
- Uma distância positiva significa que o vértice está dentro do semiespaço do clipe (o lado que você quer manter).
- Uma distância negativa significa que o vértice está fora do semiespaço de corte (o lado que você quer descartar).
Consulte o snippet a seguir, a entrada do chromestatus e o 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...
getConfiguration() do GPUCanvasContext
Depois que o configure()
do GPUCanvasContext for chamado com um dicionário de configuração, o método getConfiguration()
do GPUCanvasContext vai permitir que você verifique a configuração do contexto da tela. Ele inclui os membros device
, format
, usage
, viewFormats
, colorSpace
, toneMapping
e alphaMode
. Isso é útil para tarefas como verificar se o navegador oferece suporte à tela HDR, como mostrado no exemplo Particles (HDR). Consulte o snippet a seguir, a entrada do chromestatus e o 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.
}
As primitivas de ponto e linha não podem ter viés de profundidade
Como anunciado anteriormente, a especificação da WebGPU agora considera um erro de validação a definição de depthBias
, depthBiasSlopeScale
e depthBiasClamp
como um valor diferente de zero quando a topologia de um pipeline de renderização é um tipo de linha ou ponto. Consulte o problema 352567424.
Verificação de funções integradas para subgrupos
Como parte da experimentação de subgrupos, as seguintes funções integradas de subgrupo foram adicionadas na edição 361330160:
subgroupInclusiveAdd(value)
: retorna a soma da verificação inclusiva de todas as invocaçõesvalue
ativas no subgrupo.subgroupInclusiveMul(value)
: retorna a multiplicação de verificação inclusiva de todas as invocaçõesvalue
ativas no subgrupo.
Suporte experimental para multi-draw indireto
O recurso de GPU indireta de vários desenhos permite emitir várias chamadas de desenho com um único comando de GPU. Isso é útil principalmente em situações em que um grande número de objetos precisa ser renderizado, como sistemas de partículas, instanciação e cenas grandes. Os métodos drawIndirect()
e drawIndexedIndirect()
do GPURenderPassEncoder só podem emitir uma única chamada de renderização por vez em uma determinada região de um buffer de GPU.
Até que esse recurso experimental seja padronizado, ative a flag "Unsafe WebGPU Support" em chrome://flags/#enable-unsafe-webgpu
para disponibilizá-lo no Chrome.
Com o recurso de GPU não padrão "chromium-experimental-multi-draw-indirect"
disponível em um GPUAdapter, solicite um GPUDevice com esse recurso. Em seguida, crie um GPUBuffer com o uso de GPUBufferUsage.INDIRECT
para armazenar as chamadas de exibição. Você pode usá-lo mais tarde nos novos métodos multiDrawIndirect()
e multiDrawIndexedIndirect()
do GPURenderPassEncoder para emitir chamadas de renderização dentro de um render pass. Consulte o snippet a seguir e o 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();
Opção de compilação do módulo de sombreador com matemática rigorosa
Uma opção de desenvolvedor booleana strictMath
foi adicionada ao GPUShaderModuleDescriptor para permitir ativar ou desativar a matemática estrita durante a compilação do módulo de sombreador. Ele está disponível atrás da flag "WebGPU Developer Features" em chrome://flags/#enable-webgpu-developer-features
, o que significa que é um recurso destinado apenas ao uso durante o desenvolvimento. Consulte o problema 42241455.
No momento, essa opção tem suporte no Metal e no Direct3D. Quando a matemática rigorosa está desativada, o compilador pode otimizar seus sombreadores:
- Ignorando a possibilidade de valores NaN e Infinity.
- O -0 foi tratado como +0.
- A divisão foi substituída por uma multiplicação mais rápida pelo recíproco.
- Reorganizar operações com base em propriedades associativas e distributivas.
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 });
O método requestAdapterInfo() do GPUAdapter foi removido
O método assíncrono requestAdapterInfo()
do GPUAdapter é redundante, já que você já pode receber o GPUAdapterInfo de forma síncrona usando o atributo info
do GPUAdapter. Portanto, o método requestAdapterInfo()
não padrão do GPUAdapter foi removido. Consulte a intent de remoção.
Atualizações do Dawn
O executável tint_benchmark
mede o custo da tradução de shaders do WGSL para cada linguagem de back-end. Confira a nova documentação para saber mais.
Isso abrange apenas alguns dos principais destaques. Confira a lista completa de confirmações.
Novidades na WebGPU
Uma lista de tudo o que foi abordado na série O que há de novo na WebGPU.
Chrome 131
- Distâncias de corte na WGSL
- GPUCanvasContext getConfiguration()
- As primitivas de ponto e linha não podem ter viés de profundidade
- Funções integradas de verificação inclusiva para subgrupos
- Suporte experimental para multidraw indireto
- Opção de matemática rigorosa da compilação de módulo de sombreador
- O método requestAdapterInfo() do GPUAdapter foi removido
- Atualizações do Dawn
Chrome 130
- Combinação de duas origens
- Melhorias no tempo de compilação de sombreador no Metal
- Descontinuação do método requestAdapterInfo() do GPUAdapter
- Atualizações do Dawn
Chrome 129
- Suporte a HDR com o modo de mapeamento de tons da tela
- Suporte a subgrupos expandidos
- Atualizações do Dawn
Chrome 128
- Testes com subgrupos
- Descontinuação da configuração de viés de profundidade para linhas e pontos
- Ocultar o aviso do DevTools de erro não capturado se preventDefault
- A WGSL interpola a amostragem primeiro e
- Atualizações do Dawn
Chrome 127
- Suporte experimental para OpenGL ES no Android
- Atributo de informações do GPUAdapter
- Melhorias na interoperabilidade do WebAssembly
- Melhoria nos erros do codificador de comando
- Atualizações do Dawn
Chrome 126
- Aumento do limite de maxTextureArrayLayers
- Otimização do upload de buffer para o back-end do Vulkan
- Melhorias no tempo de compilação de sombreador
- Os buffers de comando enviados precisam ser exclusivos
- Atualizações do Dawn
Chrome 125
Chrome 124
- Texturas de armazenamento somente leitura e leitura/gravação
- Suporte a service workers e workers compartilhados
- Novos atributos de informações do adaptador
- Correções de bugs
- Atualizações do Dawn
Chrome 123
- Suporte a funções integradas do DP4a no WGSL
- Parâmetros de ponteiro irrestrito na WGSL
- Açúcar sintático para desreferenciar compósitos na WGSL
- Estado somente leitura separado para aspectos de stencil e profundidade
- Atualizações do Dawn
Chrome 122
- Ampliar o alcance com o modo de compatibilidade (recurso em desenvolvimento)
- Aumento do limite de maxVertexAttributes
- Atualizações do Dawn
Chrome 121
- Suporte à WebGPU no Android
- Usar DXC em vez de FXC para a compilação de shaders no Windows
- Consultas de carimbo de data/hora em transmissões de renderização e computação
- Pontos de entrada padrão para módulos de sombreador
- Suporte a display-p3 como espaço de cores de GPUExternalTexture
- Informações sobre pilhas de memória
- Atualizações do Dawn
Chrome 120
- Suporte a valores de ponto flutuante de 16 bits na WGSL
- Superar os limites
- Mudanças no estado do stencil de profundidade
- Atualizações das informações do adaptador
- Quantização de consultas de carimbo de data/hora
- Recursos de limpeza geral
Chrome 119
- Texturas flutuantes de 32 bits com filtro
- Formato de vértice unorm10-10-10-2
- Formato de textura rgb10a2uint
- Atualizações do Dawn
Chrome 118
- Suporte a HTMLImageElement e ImageData em
copyExternalImageToTexture()
- Suporte experimental para textura de armazenamento de leitura/gravação e somente leitura
- Atualizações do Dawn
Chrome 117
- Buffer de vértice não definido
- Desvincular grupo
- Silenciar erros da criação de pipeline assíncrono quando o dispositivo é perdido
- Atualizações na criação de módulos de sombreador SPIR-V
- Como melhorar a experiência do desenvolvedor
- Armazenamento em cache de pipelines com layout gerado automaticamente
- Atualizações do Dawn
Chrome 116
- Integração com o WebCodecs
- Dispositivo perdido retornado por GPUAdapter
requestDevice()
- Manter a reprodução de vídeo suave se
importExternalTexture()
for chamado - Conformidade com as especificações
- Como melhorar a experiência do desenvolvedor
- Atualizações do Dawn
Chrome 115
- Extensões de linguagem WGSL com suporte
- Suporte experimental para Direct3D 11
- Acessar a GPU discreta por padrão na alimentação CA
- Como melhorar a experiência do desenvolvedor
- Atualizações do Dawn
Chrome 114
- Otimizar o JavaScript
- getCurrentTexture() em uma tela não configurada gera um erro InvalidStateError
- Atualizações da WGSL
- Atualizações do Dawn