Skip to content

Bien démarrer avec WebGPU pour les développeurs de jeux

WebGPU succède à WebGL. Il est de plus bas niveau, plus explicite et conçu pour les GPU modernes. Si vous démarrez un nouveau projet 3D en 2026, WebGPU mérite d'être appris.

Tutoriel WebGPU : 10 projets couvrant toutes les étapes, de la configuration au rendu 3D avec éclairage et animation

1) Vérifier la compatibilité du navigateur

js
if (!navigator.gpu) {
  console.error('WebGPU not supported')
}

En 2026, WebGPU est disponible dans Chrome, Edge, Firefox et Safari.

2) Obtenir un périphérique

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

L'adaptateur représente le GPU physique. Le périphérique constitue votre interface avec celui-ci.

Les deux appels peuvent échouer. requestAdapter() renvoie null lorsque le système ne dispose d'aucun GPU utilisable, et requestDevice() peut rejeter la promesse. Prévoyez donc ces cas avant de poursuivre :

js
const adapter = await navigator.gpu.requestAdapter()
if (!adapter) throw new Error('No suitable GPU adapter found')
const device = await adapter.requestDevice()

L'adaptateur est également consommé dès que vous créez un périphérique à partir de celui-ci. Demandez donc un nouvel adaptateur si vous avez besoin d'un autre périphérique.

3) Configurer le canevas

js
const canvas = document.getElementById('game')
const context = canvas.getContext('webgpu')
const format = navigator.gpu.getPreferredCanvasFormat()

context.configure({
  device,
  format,
  alphaMode: 'premultiplied',
})

4) Écrire des shaders en WGSL

WebGPU utilise WGSL (WebGPU Shading Language), et non GLSL.

wgsl
@vertex
fn vs_main(@builtin(vertex_index) idx: u32) -> @builtin(position) vec4f {
  var pos = array<vec2f, 3>(
    vec2f( 0.0,  0.5),
    vec2f(-0.5, -0.5),
    vec2f( 0.5, -0.5),
  );
  return vec4f(pos[idx], 0.0, 1.0);
}

@fragment
fn fs_main() -> @location(0) vec4f {
  return vec4f(1.0, 0.5, 0.2, 1.0); // orange
}

5) Créer un module de shader

js
const shaderModule = device.createShaderModule({
  code: wgslSource,
})

6) Créer un pipeline de rendu

js
const pipeline = device.createRenderPipeline({
  layout: 'auto',
  vertex: {
    module: shaderModule,
    entryPoint: 'vs_main',
  },
  fragment: {
    module: shaderModule,
    entryPoint: 'fs_main',
    targets: [{ format }],
  },
})

7) Effectuer le rendu d'une image

js
function render() {
  const commandEncoder = device.createCommandEncoder()
  const textureView = context.getCurrentTexture().createView()

  const renderPass = commandEncoder.beginRenderPass({
    colorAttachments: [{
      view: textureView,
      clearValue: { r: 0, g: 0, b: 0, a: 1 },
      loadOp: 'clear',
      storeOp: 'store',
    }],
  })

  renderPass.setPipeline(pipeline)
  renderPass.draw(3)
  renderPass.end()

  device.queue.submit([commandEncoder.finish()])
  requestAnimationFrame(render)
}
render()

8) Les tampons dans WebGPU

js
const vertices = new Float32Array([
  -0.5, -0.5,
   0.5, -0.5,
   0.0,  0.5,
])

const vertexBuffer = device.createBuffer({
  size: vertices.byteLength,
  usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
})

device.queue.writeBuffer(vertexBuffer, 0, vertices)

9) Groupes de liaison pour les variables uniformes

js
const uniformBuffer = device.createBuffer({
  size: 64,
  usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
})

const bindGroup = device.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [{
    binding: 0,
    resource: { buffer: uniformBuffer },
  }],
})

10) WebGPU ou WebGL

AspectWebGLWebGPU
Style d'APISimilaire à OpenGL, avec étatModerne, explicite
ShadersGLSLWGSL
CalculLimité (extensions)Pris en charge nativement
MultithreadingDifficileConçu pour cela
Compatibilité des navigateursUniverselleTous les principaux navigateurs (Chrome, Edge, Safari 26, Firefox)

Quand utiliser WebGPU

  • Nouveaux projets ciblant les navigateurs modernes
  • Charges de travail intensives en calcul (physique, IA, génération procédurale)
  • Lorsque vous avez besoin d'un contrôle précis sur les ressources GPU

À lire aussi

Ressources externes