Novedades de WebGPU (Chrome 155-156)

Extensión fragment_depth de WGSL

En los pases de renderización que requieren mucha geometría, las optimizaciones de Z temprana son el mejor amigo de los desarrolladores. Proporcionan un aumento masivo del rendimiento, ya que permiten que la GPU descarte los píxeles ocultos antes de ejecutar sombreadores de fragmentos costosos. Si una profundidad rasterizada no pasa la prueba de profundidad, la GPU omite por completo el sombreador de fragmentos, siempre que el sombreador no tenga otros efectos secundarios.

Si quieres saber cómo el hardware maneja esto, MJP tiene un excelente artículo sobre ¿Cuándo se debe inhabilitar Early-Z?.

Si bien la manipulación de profundidad personalizada es útil, hacerla en tu sombreador de fragmentos tiene un costo oculto. Por lo general, escribir en @builtin(frag_depth) dentro de un sombreador de fragmentos obliga a los controladores a inhabilitar estas optimizaciones de Z temprana para toda la llamada de dibujo. Esto sucede porque las heurísticas del controlador no pueden garantizar que la profundidad de salida calculada del sombreador coincida con la profundidad interpolada por el rasterizador.

Para abordar esta penalización de rendimiento, la extensión de WGSL fragment_depth te permite especificar un nombre de modo de profundidad less o greater en @builtin(frag_depth) para indicar de forma explícita cómo se compara la profundidad escrita con la profundidad interpolada, lo que permite que la GPU aplique de forma segura optimizaciones de Z temprana.

Esta extensión de lenguaje se puede detectar como compatible con la función en JavaScript con navigator.gpu.wgslLanguageFeatures. Se recomienda usar una directiva requires para indicar la posibilidad de no portabilidad con requires fragment_depth; en la parte superior del código del sombreador WGSL. Consulta el siguiente ejemplo y la intención de lanzamiento.

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const shaderModule = device.createShaderModule({ code: `
  requires fragment_depth;

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

Compresión de texturas sin alineación

La función de GPU "texture-compression-unaligned" permite crear texturas comprimidas con dimensiones que no son múltiplos enteros del tamaño del bloque (como 4x4 para los formatos BC, ETC2 y ASTC). Anteriormente, WebGPU requería estrictamente que los tamaños de las texturas se alinearan con estos límites de bloques. Al eliminar la necesidad de rellenar o escalar texturas para que se ajusten a las alineaciones de bloques, esta función conserva la fidelidad de la compresión original sin introducir distorsión por escalamiento. Consulta la intención de lanzamiento.

El siguiente fragmento de código verifica si el adaptador admite la compresión de texturas no alineada y, si está disponible, solicita un dispositivo con ella.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
  throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
  requiredFeatures: ["texture-compression-unaligned"],
});

Agradecemos al colaborador externo Ignacio Castaño por impulsar esta función.

Espacios de color srgb-linear y display-p3-linear

Con la incorporación de los espacios de color predefinidos "srgb-linear" y "display-p3-linear", el contexto del lienzo de WebGPU ahora puede renderizar directamente en espacios de color lineales de rango extendido para admitir pantallas de gama amplia. Estos espacios de color mantienen una relación lineal entre los valores de píxeles y la luminancia física. Esto las hace ideales para la renderización de luz física en juegos, así como para tareas de procesamiento espacial, como el suavizado, la interpolación y la reducción de la resolución. Consulta la intención de lanzamiento y la PR de muestra de partículas (HDR) #574.

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",
  colorSpace: "display-p3-linear",
});

Formato de vértice adicional snorm10-10-10-2

El formato de vértice "snorm10-10-10-2" es un formato empaquetado de 32 bits que contiene cuatro valores normalizados firmados: tres componentes de 10 bits (r, g, b) y un componente de 2 bits (a). Con este formato, puedes almacenar de manera eficiente atributos, como vectores normales en 3D con un escalar adicional de 2 bits o una marca de alineación, mientras ahorras ancho de banda de memoria. Consulta la PR 6491 de la especificación.

Compatibilidad con f16 en Linux para NVIDIA

La función opcional "shader-f16", que proporciona compatibilidad con valores de punto flotante de 16 bits en WGSL, ahora es compatible con Linux para los controladores de GPU de NVIDIA recientes. Consulta el problema chromium:42251215.

Actualizaciones de Dawn

Ahora puedes consultar el LUID del DXGIAdapter subyacente para un adaptador de GPU determinado con la estructura WGPUAdapterPropertiesD3D. Consulta el problema chromium:562849566.

Aquí se incluyen algunos de los aspectos destacados clave. Consulta la lista exhaustiva de confirmaciones.

Novedades de WebGPU

Una lista de todo lo que se abordó en la serie Novedades de WebGPU

Chrome 155 y 156

Chrome 153-154

Chrome 151-152

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113