Skip to content

Oyun geliştiriciler için WebGPU'ya başlangıç

WebGPU, WebGL'nin halefidir. Daha düşük seviyeli, daha açık ve modern GPU'lar için tasarlanmış bir API'dir. 2026'da yeni bir 3D projeye başlıyorsanız WebGPU'yu öğrenmeye değer.

WebGPU Eğitimi: Kurulumdan aydınlatmalı ve animasyonlu 3D işlemeye kadar uzanan 10 proje

1) Tarayıcı desteğini kontrol edin

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

2026 itibarıyla WebGPU; Chrome, Edge, Firefox ve Safari'de kullanılabilir.

2) Bir cihaz edinin

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

Bağdaştırıcı, fiziksel GPU'yu temsil eder. Cihaz ise onunla iletişim kurmanızı sağlayan arayüzdür.

Her iki çağrı da başarısız olabilir. Sistemde kullanılabilir bir GPU olmadığında requestAdapter() değeri null döndürür ve requestDevice() çağrısı reddedilebilir; bu nedenle devam etmeden önce bunlara karşı önlem alın:

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

Bir bağdaştırıcıdan cihaz oluşturduğunuzda bağdaştırıcı da tüketilir; bu nedenle başka bir cihaza ihtiyacınız varsa yeni bir bağdaştırıcı isteyin.

3) Tuvali yapılandırın

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

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

4) Gölgelendiricileri WGSL ile yazın

WebGPU, GLSL yerine WGSL'yi (WebGPU Gölgelendirme Dili) kullanır.

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) Bir gölgelendirici modülü oluşturun

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

6) Bir işleme işlem hattı oluşturun

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

7) Bir kare işleyin

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) WebGPU'da tamponlar

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) Tekbiçimli değişkenler için bağlama grupları

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 ve WebGL karşılaştırması

ÖzellikWebGLWebGPU
API tarzıOpenGL benzeri, durum bilgiliModern, açık
GölgelendiricilerGLSLWGSL
HesaplamaSınırlı (uzantılar)Birinci sınıf destek
Çoklu iş parçacığıZorBunun için tasarlandı
Tarayıcı desteğiEvrenselTüm büyük tarayıcılar (Chrome, Edge, Safari 26, Firefox)

WebGPU ne zaman kullanılmalı?

  • Modern tarayıcıları hedefleyen yeni projelerde
  • Yoğun hesaplama gerektiren iş yüklerinde (fizik, yapay zekâ, prosedürel üretim)
  • GPU kaynakları üzerinde ayrıntılı denetime ihtiyaç duyduğunuzda

İlgili içerikler

Harici Kaynaklar