El consorcio W3C ha presentado los primeros borradores de las especificaciones de WebGPU y WebGPU Shading Language (WGSL), que definen una API para ejecutar operaciones en GPU, como renderizado y cálculos, así como un lenguaje de sombreado para escribir programas que se ejecutan en la GPU. Conceptualmente, es similar a las API Vulkan, Metal y Direct3D 12. Las especificaciones fueron elaboradas por un grupo de trabajo que incluye ingenieros de Mozilla, Google, Apple y Microsoft.
Conceptualmente, WebGPU se diferencia de WebGL de manera similar a como la API gráfica Vulkan se diferencia de OpenGL, pero no se basa en una API gráfica específica, sino que representa una capa universal que utiliza los mismos primitivos de bajo nivel que se encuentran en Vulkan, Metal y Direct3D. WebGPU proporciona a las aplicaciones en JavaScript herramientas para un control de bajo nivel sobre la organización, procesamiento y envío de comandos a la GPU, la gestión de recursos, memoria, búferes, objetos de texturas y sombreadores gráficos compilados. Este enfoque permite lograr un mayor rendimiento en aplicaciones gráficas al reducir la sobrecarga y aumentar la eficiencia en el uso de la GPU.
WebGPU permite crear proyectos 3D complejos para la web que funcionan tan bien como programas independientes que interactúan directamente con Vulkan, Metal o Direct3D, pero sin estar atados a plataformas específicas. WebGPU también ofrece capacidades adicionales para portar aplicaciones gráficas nativas a un formato capaz de funcionar con tecnologías web, gracias a la compilación en WebAssembly. Además de la gráfica 3D, WebGPU también abarca capacidades relacionadas con la realización de cálculos en la GPU y la ejecución de sombreadores.
Características clave de WebGPU:
- Gestión de recursos, trabajos preparatorios y transmisión de comandos a la GPU de manera independiente (en WebGL, un objeto se ocupaba de todo a la vez). Se ofrecen tres contextos separados: GPUDevice para crear recursos como texturas y búferes; GPUCommandEncoder para codificar comandos individuales, incluidos las etapas de renderizado y computación; GPUCommandBuffer para encolar en la GPU para su ejecución. El resultado puede ser renderizado en un área asociada a uno o varios elementos canvas, o procesado sin salida (por ejemplo, al ejecutar tareas computacionales). La separación de etapas facilita la distribución de la creación de recursos y las operaciones de preparación en diferentes manejadores que pueden ejecutarse en diferentes hilos.
- Un enfoque diferente para el manejo de estados. En WebGPU se proponen dos objetos: GPURenderPipeline y GPUComputePipeline, que permiten combinar distintos estados previamente definidos por el desarrollador, lo que permite al navegador no gastar recursos en realizar trabajos adicionales, como la recompilación de sombreadores. Entre los estados admitidos se encuentran: sombreadores, disposiciones de búferes de vértices y atributos, disposiciones de grupos adjuntos, mezcla, profundidad y plantillas, formatos de salida después del renderizado.
- Un modelo de vinculación, que recuerda en gran medida a las herramientas de agrupación de recursos existentes en Vulkan. Para agrupar recursos en WebGPU se proporciona el objeto GPUBindGroup, que durante la grabación de comandos se puede vincular con otros objetos similares para su uso en sombreadores. La creación de tales grupos permite al controlador ejecutar con anticipación las acciones preparatorias necesarias, y al navegador le permite cambiar las vinculaciones de recursos entre las llamadas de renderizado de manera significativamente más rápida. La disposición de las vinculaciones de recursos puede definirse de antemano mediante el objeto GPUBindGroupLayout.
Fuente: opennet.ru
