Suporte a HDR com o modo de mapeamento de tons da tela
Os desenvolvedores da Web têm opções limitadas para fornecer conteúdo HDR, dependendo principalmente dos elementos <img>
e <video>
. No entanto, o elemento <canvas>
continua restrito ao SDR. Para gerar conteúdo HDR dinâmico em uma tela, é necessário codificar o conteúdo como uma imagem HDR antes de exibi-lo. Para conferir um exemplo, consulte esta demonstração.
O novo parâmetro GPUCanvasToneMappingMode
na configuração de tela da WebGPU agora permite que a WebGPU desenhe cores mais claras do que o branco (#FFFFFF
). Ele faz isso pelos seguintes modos:
"standard"
: o comportamento padrão restringe o conteúdo ao intervalo SDR da tela. Esse modo é alcançado ao limitar todos os valores de cor no espaço de cor da tela ao intervalo[0, 1]
."extended"
: desbloqueia o intervalo HDR completo da tela. Esse modo corresponde a"standard"
no intervalo[0, 1]
da tela. A limitação ou projeção é feita para o intervalo dinâmico estendido da tela, mas não para[0, 1]
.
O snippet de código a seguir mostra como configurar uma tela para o alto alcance dinâmico.
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",
toneMapping: { mode: "extended" },
});
Explore o HDR com a WebGPU conferindo as amostras de Particles (HDR) e WebGPU HDR e a entrada do chromestatus (links em inglês).
Suporte para subgrupos expandidos
Após o anúncio da experimentação de subgrupos, as funções integradas de subgrupos agora estão disponíveis para uso em sombreadores de computação e de fragmentos. Eles não são mais restritos a shaders de computação. Consulte o problema 354738715.
O valor integrado subgroup_size
está com bugs em sombreadores de fragmentos. Evite por enquanto.
Além disso, as seguintes funções integradas do subgrupo foram adicionadas:
subgroupAdd(value)
: retorna a soma de todas as invocaçõesvalue
ativas no subgrupo.subgroupExclusiveAdd(value)
: retorna a soma de verificação exclusiva de todas as invocaçõesvalue
ativas no subgrupo.subgroupMul(value)
: retorna a multiplicação de todas as invocaçõesvalue
ativas no subgrupo.subgroupExclusiveMul(value)
: retorna a multiplicação de verificação exclusiva de todas as invocaçõesvalue
ativas no subgrupo.subgroupAnd(value)
: retorna o AND binário de todas as invocaçõesvalue
ativas no subgrupo.subgroupOr(value)
: retorna o OU binário de todas as invocaçõesvalue
ativas no subgrupo.subgroupXor(value)
: retorna o XOR binário de todas asvalue
s de invocações ativas no subgrupo.subgroupMin(value)
: retorna o valor mínimo de todas as invocaçõesvalue
ativas no subgrupo.subgroupMax(value)
: retorna o valor máximo de todas as invocaçõesvalue
ativas no subgrupo.subgroupAll(value)
: retorna verdadeiro sevalue
for verdadeiro para todas as invocações ativas no subgrupo.subgroupAny(value)
: retorna "true" sevalue
for verdadeiro para qualquer invocação ativa no subgrupo.subgroupElect()
: retorna verdadeiro se essa invocação tiver osubgroup_invocation_id
mais baixo entre as invocações ativas no subgrupo.subgroupBroadcastFirst(value)
: transmitevalue
da invocação ativa com osubgroup_invocation_id
mais baixo no subgrupo para todas as outras invocações ativas.subgroupShuffle(value, id)
: retornavalue
da invocação ativa cujosubgroup_invocation_id
corresponde aid
.subgroupShuffleXor(value, mask)
: retorna ovalue
da invocação ativa comsubgroup_invocation_id
correspondente asubgroup_invocation_id ^ mask
.mask
precisa ser dinamicamente uniforme.subgroupShuffleUp(value, delta)
: retornavalue
da invocação ativa cujosubgroup_invocation_id
corresponde asubgroup_invocation_id - delta
.subgroupShuffleDown(value, delta)
: retornavalue
da invocação ativa cujosubgroup_invocation_id
corresponde asubgroup_invocation_id + delta
.quadBroadcast(value, id)
: transmitevalue
pela invocação do quad com ID igual aid
.id
precisa ser uma expressão constante.quadSwapX(value)
: trocavalue
entre as invocações no quadrado na direção X.quadSwapY(value)
: trocavalue
entre as invocações no quad na direção Y.quadSwapDiagonal(value)
: trocavalue
entre as invocações no quadrado na diagonal.
Atualizações do amanhecer
O struct wgpu::PrimitiveState
agora inclui diretamente a configuração de controle de corte de profundidade, eliminando a necessidade de um struct wgpu::PrimitiveDepthClipControl
separado. Para saber mais, consulte o snippet de código a seguir e o PR webgpu-headers.
// Before
wgpu::PrimitiveState primitive = {};
wgpu::PrimitiveDepthClipControl depthClipControl;
depthClipControl.unclippedDepth = true;
primitive.nextInChain = &depthClipControl;
// Now
wgpu::PrimitiveState primitive = {};
primitive.unclippedDepth = true;
Isso cobre 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 compilação do módulo do sombreador: matemática rigorosa
- O método requestAdapterInfo() do GPUAdapter foi removido
- Atualizações do amanhecer
Chrome 130
- Combinação de fontes duplas
- 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
- Ampliação do suporte a subgrupos
- Atualizações do Dawn
Chrome 128
- Testar subgrupos
- A 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 amanhecer
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 de upload de buffer para o back-end do Vulkan
- Melhorias no tempo de compilação do sombreador
- Os buffers de comando enviados precisam ser exclusivos
- Atualizações do Dawn
Chrome 125
- Subgrupos (recurso em desenvolvimento)
- Renderizar uma fração de textura 3D
- Atualizações do amanhecer
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 amanhecer
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 computação e renderização
- Pontos de entrada padrão para módulos de sombreador
- Suporte a display-p3 como espaço de cores GPUExternalTexture
- Informações sobre heaps 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 para fazer faxina
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 amanhecer
Chrome 117
- Buffer de vértice não definido
- Desvincular grupo
- Silenciar erros da criação de pipeline assíncrono quando o dispositivo for perdido
- Atualizações na criação de módulos de sombreador SPIR-V
- Como melhorar a experiência do desenvolvedor
- Pipelines em cache com layout gerado automaticamente
- Atualizações do amanhecer
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 amanhecer
Chrome 115
- Extensões de idiomas da WGSL compatíveis
- 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 InvalidStateError
- Atualizações da WGSL
- Atualizações do amanhecer