Skip to content

Primeiros passos com WebGPU para desenvolvedores de jogos

WebGPU é o sucessor do WebGL. É uma API de nível mais baixo, mais explícita e projetada para GPUs modernas. Se você está começando um novo projeto 3D em 2026, vale a pena aprender WebGPU.

Tutorial de WebGPU: 10 projetos que abrangem desde a configuração até a renderização 3D com iluminação e animação

1) Verifique a compatibilidade do navegador

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

Em 2026, o WebGPU está disponível no Chrome, Edge, Firefox e Safari.

2) Obtenha um dispositivo

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

O adaptador representa a GPU física. O dispositivo é sua interface com ela.

Ambas as chamadas podem falhar. requestAdapter() retorna null quando o sistema não tem uma GPU utilizável, e requestDevice() pode ser rejeitada, portanto, trate essas possibilidades antes de continuar:

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

O adaptador também é consumido quando você cria um dispositivo a partir dele. Portanto, solicite um novo adaptador se precisar de outro dispositivo.

3) Configure o canvas

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

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

4) Escreva shaders em WGSL

O WebGPU usa WGSL (WebGPU Shading Language), e não 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) Crie um módulo de shader

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

6) Crie um pipeline de renderização

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

7) Renderize um quadro

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) Buffers no 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) Grupos de vinculação para 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 vs. WebGL

AspectoWebGLWebGPU
Estilo da APISemelhante ao OpenGL, baseada em estadoModerna, explícita
ShadersGLSLWGSL
ComputaçãoLimitada (extensões)Suporte de primeira classe
MultithreadingDifícilProjetada para isso
Compatibilidade dos navegadoresUniversalTodos os principais navegadores (Chrome, Edge, Safari 26, Firefox)

Quando usar WebGPU

  • Novos projetos voltados para navegadores modernos
  • Cargas de trabalho com uso intensivo de computação (física, IA, geração procedural)
  • Quando você precisa de controle granular sobre os recursos da GPU

Conteúdo relacionado

Recursos externos