Novedades de WebGPU (Chrome 155-156)

Extensión fragment_depth de WGSL

En los pases de renderización con uso intensivo de geometría, las optimizaciones de early-Z son el mejor amigo de los desarrolladores. Proporcionan un gran aumento 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 el sombreador de fragmentos por completo, siempre que el sombreador no tenga otros efectos secundarios.

Si quieres leer sobre 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, hacerlo en el 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 la heurística del controlador no puede 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 optimizaciones de Z temprana de forma segura.

Esta extensión de lenguaje se puede detectar en JavaScript con navigator.gpu.wgslLanguageFeatures. Se recomienda usar una directiva requires para indicar la posibilidad de que no sea portátil con requires fragment_depth; en la parte superior del código del sombreador de WGSL. Consulta el siguiente ejemplo y el intent to ship.

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 no alineada

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. Como elimina 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 distorsiones de escalamiento. Consulta la intención de envío.

En el siguiente fragmento de código, se verifica si el adaptador admite la compresión de texturas sin alinear 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"],
});

Muchas gracias al colaborador externo Ignacio Castaño de spark.js por impulsar esta función, la especificación y el trabajo de CTS.

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 se puede renderizar directamente en espacios de color lineales de rango extendido para admitir pantallas de amplia gama. 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 de líneas, la interpolación y la reducción de resolución. Consulta la intención de envío y la muestra de partículas (HDR) PR #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 snorm10-10-10-2 adicional

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

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.

Esto abarca algunos de los aspectos destacados clave. Consulta la lista exhaustiva de confirmaciones.

Novedades de WebGPU

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

Chrome 155-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