Skip to content

Memulai WebGPU untuk pengembang game

WebGPU adalah penerus WebGL. API ini lebih rendah tingkatnya, lebih eksplisit, dan dirancang untuk GPU modern. Jika Anda memulai proyek 3D baru pada tahun 2026, WebGPU layak dipelajari.

Tutorial WebGPU: 10 proyek yang mencakup penyiapan hingga rendering 3D dengan pencahayaan dan animasi

1) Periksa dukungan browser

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

Pada tahun 2026, WebGPU tersedia di Chrome, Edge, Firefox, dan Safari.

2) Dapatkan perangkat

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

Adapter merepresentasikan GPU fisik. Perangkat adalah antarmuka Anda untuk berinteraksi dengannya.

Kedua pemanggilan dapat gagal. requestAdapter() mengembalikan null ketika sistem tidak memiliki GPU yang dapat digunakan, sedangkan requestDevice() dapat ditolak, jadi tangani kemungkinan tersebut sebelum melanjutkan:

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

Adapter juga dianggap telah digunakan setelah Anda membuat perangkat darinya, jadi minta adapter baru jika Anda memerlukan perangkat lain.

3) Konfigurasikan kanvas

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

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

4) Tulis shader dalam WGSL

WebGPU menggunakan WGSL (WebGPU Shading Language), bukan 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) Buat modul shader

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

6) Buat pipeline rendering

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

7) Render sebuah frame

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 di 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 group untuk uniform

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

AspekWebGLWebGPU
Gaya APISeperti OpenGL, berbasis statusModern, eksplisit
ShaderGLSLWGSL
KomputasiTerbatas (ekstensi)Dukungan kelas utama
Multi-threadingSulitDirancang untuk itu
Dukungan browserUniversalSemua browser utama (Chrome, Edge, Safari 26, Firefox)

Kapan sebaiknya menggunakan WebGPU

  • Proyek baru yang menargetkan browser modern
  • Beban kerja komputasi berat (fisika, AI, generasi prosedural)
  • Saat Anda memerlukan kontrol mendetail atas sumber daya GPU

Terkait

Sumber Daya Eksternal