Skip to content

WebGPU-Einstieg für Spieleentwickler ​

WebGPU ist der Nachfolger von WebGL. Es ist hardwarenäher, expliziter und auf moderne GPUs ausgelegt. Wenn du 2026 ein neues 3D-Projekt startest, lohnt es sich, WebGPU zu lernen.

WebGPU-Tutorial: 10 Projekte vom Setup bis zum 3D-Rendering mit Licht und Animation

1) Browser-Unterstützung prüfen ​

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

Stand 2026 ist WebGPU in Chrome, Edge, Firefox und Safari verfügbar.

2) Ein Device holen ​

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

Der Adapter steht für die physische GPU. Das Device ist deine Schnittstelle dorthin.

Beide Aufrufe können fehlschlagen. requestAdapter() liefert null, wenn das System keine nutzbare GPU hat, und requestDevice() kann rejecten. Sichere das ab, bevor du weitermachst:

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

Der Adapter ist außerdem verbraucht, sobald du ein Device daraus erzeugst. Fordere also einen neuen an, wenn du ein weiteres Device brauchst.

3) Das Canvas konfigurieren ​

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

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

4) Shader in WGSL schreiben ​

WebGPU nutzt WGSL (WebGPU Shading Language), nicht 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) Ein Shader-Modul erstellen ​

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

6) Eine Render-Pipeline erstellen ​

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

7) Ein Frame rendern ​

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) Buffer in 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) Bind Groups für Uniforms ​

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 gegen WebGL ​

AspektWebGLWebGPU
API-StilOpenGL-artig, zustandsbehaftetModern, explizit
ShaderGLSLWGSL
ComputeEingeschränkt (Erweiterungen)Von Haus aus dabei
MultithreadingSchwierigDafür entworfen
Browser-UnterstützungÜberallAlle großen Browser (Chrome, Edge, Safari 26, Firefox)

Wann WebGPU sinnvoll ist ​

  • Neue Projekte für moderne Browser
  • Rechenlastige Aufgaben (Physik, KI, prozedurale Generierung)
  • Wenn du feingranulare Kontrolle über GPU-Ressourcen brauchst

Verwandt ​

Externe Ressourcen ​