El panorama de los gráficos en la web está cambiando rápidamente. En 2026, WebGPU se consolida como la API estándar para renderizado de alta performance, ofreciendo acceso directo a la GPU desde JavaScript. En este artículo vemos qué hay de nuevo, cómo configurar tu entorno y construimos, paso a paso, el clásico triángulo usando la API.
Tabla de contenidos
- Conceptos básicos y arquitectura
- Configuración del entorno y primer shader
- Renderizado de un triángulo con WebGPU
- Mejores prácticas y rendimiento
- Conclusión
Conceptos básicos y arquitectura
WebGPU expone dos capas principales: la capa de adapter, que representa una GPU disponible en el sistema, y la capa de device, que es la interfaz para crear recursos (buffers, textures) y ejecutar comandos.
La comunicación se realiza mediante command buffers que se envían a una queue. Esta arquitectura se parece a la de Vulkan o Direct3D 12, pero está simplificada para JavaScript.
Para profundizar en la especificación oficial puedes consultar la especificación de GPUWeb y la guía de MDN WebGPU API.
Configuración del entorno y primer shader
Antes de escribir código, asegúrate de contar con un navegador que soporte WebGPU (Chrome ≥ 119, Edge ≥ 119, o versiones Nightly de Firefox). Activa la bandera chrome://flags/#enable-webgpu si es necesario.
El primer paso es solicitar un adapter y crear un device:
async function initWebGPU() {
if (!navigator.gpu) {
throw new Error('WebGPU no está disponible en este navegador');
}
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
throw new Error('No se encontró un adapter compatible');
}
const device = await adapter.requestDevice();
return {adapter, device};
}
Con el device listo, definimos un shader en WGSL (WebGPU Shading Language). El siguiente fragmento muestra un shader mínimo que pinta un triángulo:
[[stage(vertex)]]
fn vs_main([[builtin(vertex_index)]] vertexIndex : u32) -> [[builtin(position)]] vec4 {
var positions = array, 3>(
vec2(0.0, 0.5),
vec2(-0.5, -0.5),
vec2(0.5, -0.5)
);
let pos = positions[vertexIndex];
return vec4(pos, 0.0, 1.0);
}
[[stage(fragment)]]
fn fs_main() -> [[location(0)]] vec4 {
return vec4(0.0, 0.8, 0.2, 1.0);
}
Guardamos el código WGSL en una GPUShaderModule:
const shaderModule = device.createShaderModule({code: wgslSource});
Renderizado de un triángulo con WebGPU
Ahora ensamblamos el pipeline y dibujamos el triángulo en un canvas HTML.
async function renderTriangle() {
const canvas = document.querySelector('#gpu-canvas');
const context = canvas.getContext('webgpu');
const {device} = await initWebGPU();
const format = navigator.gpu.getPreferredCanvasFormat();
context.configure({device, format, alphaMode: 'opaque'});
const pipeline = device.createRenderPipeline({
layout: 'auto',
vertex: {
module: shaderModule,
entryPoint: 'vs_main',
},
fragment: {
module: shaderModule,
entryPoint: 'fs_main',
targets: [{format}]
},
primitive: {topology: 'triangle-list'}
});
const commandEncoder = device.createCommandEncoder();
const renderPass = commandEncoder.beginRenderPass({
colorAttachments: [{
view: context.getCurrentTexture().createView(),
clearValue: {r: 0, g: 0, b: 0, a: 1},
loadOp: 'clear',
storeOp: 'store'
}]
});
renderPass.setPipeline(pipeline);
renderPass.draw(3, 1, 0, 0);
renderPass.end();
device.queue.submit([commandEncoder.finish()]);
}
renderTriangle().catch(console.error);
El código anterior cubre todo el flujo: obtener la GPU, crear el shader, configurar el canvas y ejecutar el dibujado. Si todo está bien, verás un triángulo verde centrado.
Mejores prácticas y rendimiento
Para proyectos reales, ten en cuenta los siguientes puntos:
- Reusar pipelines: crear un pipeline es costoso; reutilízalo siempre que sea posible.
- Buffers de datos alineados: WebGPU exige alineación de 256 bytes para ciertos recursos; usa
GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DSTcon relleno si es necesario. - Gestión de recursos: libera buffers y texturas mediante
buffer.destroy()cuando ya no se necesiten. - Depuración: habilita la extensión Chrome DevTools WebGPU para inspeccionar command buffers y estados de pipeline.
La versión 2026 introduce GPUQuerySet mejorado, permitiendo medir tiempos de ejecución con mayor precisión, y texture compression formats como BC7, lo que reduce la carga de datos.
Conclusión
WebGPU ha madurado lo suficiente como para considerarse la solución definitiva para renderizado de alto rendimiento en la web. Con este tutorial tienes los cimientos para explorar escenarios más complejos: modelos 3D, efectos post‑procesado y computación GPGPU.
Continúa experimentando, revisa la repositorio oficial y mantente al tanto de las actualizaciones de la especificación.