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 ​