Webgl์™€ Webgpu์˜ ๊ฐœ๋… ๋ฐ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž

Webgl์™€ Webgpu์˜ ๊ฐœ๋… ๋ฐ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž

D
dongAuthor
6 min read

์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ•œ ๋ฒˆ์ฏค์€ 3D ๊ทธ๋ž˜ํ”ฝ์Šค๋‚˜ ๋ณต์žกํ•œ ์‹œ๊ฐํ™”๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์ง๋ฉดํ•ฉ๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ WebGL์ด ์›น์—์„œ ๊ณ ์„ฑ๋Šฅ ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ‘œ์ค€์ด์—ˆ๋‹ค๋ฉด, ์ด์ œ๋Š” WebGPU๋ผ๋Š” ์ƒˆ๋กœ์šด ์„ ํƒ์ง€๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” WebGL๊ณผ WebGPU์˜ ํ•ต์‹ฌ ์ฐจ์ด์ ์„ ๋ถ„์„ํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์‹ค์ œ ๊ฐœ๋ฐœ ํ˜„์žฅ์—์„œ ์–ด๋–ค ๊ธฐ์ˆ ์„ ์„ ํƒํ•ด์•ผ ํ• ์ง€์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


WebGL์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

WebGL(Web Graphics Library)์€ 2011๋…„๊ฒฝ ์ฒ˜์Œ ๋“ฑ์žฅํ•œ JavaScript API๋กœ, ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ณ ์„ฑ๋Šฅ 3D ๋ฐ 2D ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. OpenGL ES 2.0์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ GPU์˜ ์„ฑ๋Šฅ์„ ์ง์ ‘ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํ˜์‹ ์ ์ด์—ˆ์ฃ .

WebGL์˜ ๊ฐ€์žฅ ํฐ ๊ฐ•์ ์€ ํญ๋„“์€ ๋ธŒ๋ผ์šฐ์ € ์ง€์›์ž…๋‹ˆ๋‹ค.
Chrome 9(2011๋…„), Firefox 4(2011๋…„), Safari 5.1(2011๋…„) ๋ฒ„์ „๋ถ€ํ„ฐ ์ง€์›๋˜๊ธฐ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ, ํ˜„์žฌ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ WebGL์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ: ์ „์—ญ ์ƒํƒœ๊ฐ€ ๋งŽ์•„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ด ์–ด๋ ค์›€
  • ๋™๊ธฐ์‹ API: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ œํ•œ์ 
  • ์ œํ•œ์ ์ธ GPU ํ™œ์šฉ: ์ตœ์‹  GPU ๊ธฐ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•จ

WebGPU: ์ฐจ์„ธ๋Œ€ ์›น ๊ทธ๋ž˜ํ”ฝ์Šค API

WebGPU๋Š” WebGL์˜ ํ›„์† ๊ธฐ์ˆ ๋กœ, ํ˜„๋Œ€์ ์ธ GPU ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ ํ™”๋œ API์ž…๋‹ˆ๋‹ค.
๋‹จ์ˆœํžˆ ๊ทธ๋ž˜ํ”ฝ์Šค ๋ Œ๋”๋ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒ”์šฉ GPU ์ปดํ“จํŒ…(GPGPU)๊นŒ์ง€ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.

WebGPU๊ฐ€ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ฃผ์š” ๋ฌธ์ œ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • WebGL์˜ ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฌธ์ œ
  • ํ˜„๋Œ€ GPU์˜ ์„ฑ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
  • ์ปดํ“จํŠธ ์…ฐ์ด๋” ์ง€์› ๋ถ€์žฌ

Mozilla ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, WebGPU๋Š” "ํ˜„๋Œ€ GPU์™€์˜ ํ˜ธํ™˜์„ฑ ํ–ฅ์ƒ, ๋ฒ”์šฉ GPU ์ปดํ“จํŒ… ์ง€์›, ๋” ๋น ๋ฅธ ์—ฐ์‚ฐ, ๊ณ ๊ธ‰ GPU ๊ธฐ๋Šฅ ์ ‘๊ทผ"๋ผ๊ณ  ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ์ฐจ์ด์  ๋ถ„์„

API ์„ค๊ณ„ ์ฒ ํ•™์˜ ์ฐจ์ด

WebGL์˜ ์ƒํƒœ ๊ธฐ๋ฐ˜ ์„ค๊ณ„
WebGL์€ OpenGL์˜ ์ „ํ†ต์„ ์ด์–ด๋ฐ›์•„ ์ „์—ญ ์ƒํƒœ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋Š” ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ง๊ด€์ ์ด์ง€๋งŒ, ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

WebGPU์˜ ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค ์„ค๊ณ„
WebGPU๋Š” ํŒŒ์ดํ”„๋ผ์ธ(pipeline) ๊ฐœ๋…์„ ๋„์ž…ํ•˜์—ฌ ๋ Œ๋”๋ง ์ƒํƒœ๋ฅผ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ถ”์ ํ•ด์•ผ ํ•  ์ƒํƒœ์˜ ์–‘์ด ํฌ๊ฒŒ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

// WebGPU ํŒŒ์ดํ”„๋ผ์ธ ์˜ˆ์‹œ
const renderPipeline = device.createRenderPipeline({
  vertex: {module: shaderModule,entryPoint: 'vertex_main',
  },
  fragment: {module: shaderModule,entryPoint: 'fragment_main',
  },
  primitive: {topology: 'triangle-list',
  },
  // ๋ชจ๋“  ๋ Œ๋”๋ง ์ƒํƒœ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ์บก์Аํ™”๋จ
});

์…ฐ์ด๋”ฉ ์–ธ์–ด์˜ ์ง„ํ™”

  • WebGL: GLSL(OpenGL Shading Language) ์‚ฌ์šฉ
  • WebGPU: WGSL(WebGPU Shading Language) ์‚ฌ์šฉ

WGSL์€ ์ตœ์‹  GPU ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ ํ™”๋˜์–ด ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ๋” ์ง๊ด€์ ์ด๊ณ  ์•ˆ์ „ํ•œ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ํ˜์‹ 

WebGPU๋Š” ์™„์ „ํžˆ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ  GPU ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

// WebGPU์˜ ๋น„๋™๊ธฐ ๋””๋ฐ”์ด์Šค ์ดˆ๊ธฐํ™”
async function initWebGPU() {
  if (!navigator.gpu) {throw Error("WebGPU๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {throw Error("WebGPU ์–ด๋Œ‘ํ„ฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
  }

  const device = await adapter.requestDevice();
  return device;
}

์ปดํ“จํŠธ ์…ฐ์ด๋” ์ง€์›

WebGPU์˜ ๊ฐ€์žฅ ํฐ ํ˜์‹  ์ค‘ ํ•˜๋‚˜๋Š” ์ปดํ“จํŠธ ์…ฐ์ด๋”์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๊ทธ๋ž˜ํ”ฝ์Šค ๋ Œ๋”๋ง ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๋ฒ”์šฉ ์ปดํ“จํŒ… ์ž‘์—…์„ GPU์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™œ์šฉ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ๋ฌผ๋ฆฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
  • ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ
  • ๋จธ์‹ ๋Ÿฌ๋‹ ์ถ”๋ก 
  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

ํ–ฅ์ƒ๋œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

WebGPU๋Š” API์—์„œ ๋ฐ˜ํ™˜๋˜๋Š” ๋ชจ๋“  ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ํ˜ธ์ถœ ์Šคํƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ๊ฐ WebGPU ๊ฐ์ฒด์— ์ปค์Šคํ…€ ๋ผ๋ฒจ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด ๋””๋ฒ„๊น…์ด ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


์„ฑ๋Šฅ ๋น„๊ต ๋ถ„์„

์ด๋ก ์  ์„ฑ๋Šฅ ์šฐ์œ„

WebGPU๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ด๋ก ์ ์œผ๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ๋‚ฎ์€ CPU ์˜ค๋ฒ„ํ—ค๋“œ: ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ ๋น„์šฉ ๊ฐ์†Œ
  • ํ˜„๋Œ€ GPU ๊ธฐ๋Šฅ ํ™œ์šฉ: ์ตœ์‹  GPU ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ ํ™”๋œ ์„ค๊ณ„
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ๋ธ”๋กœํ‚น ์ตœ์†Œํ™”

์‹ค์ œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

ํ•˜์ง€๋งŒ ์‹ค์ œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ํฅ๋ฏธ๋กœ์šด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.
Babylon.js ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ๋ณด๊ณ ์— ๋”ฐ๋ฅด๋ฉด:

โ€œWebGL์ด WebGPU ์—”์ง„๋ณด๋‹ค ๋ˆˆ์— ๋„๊ฒŒ ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ GPU ํŒŒํ‹ฐํด์ด ๋งŽ์€ ์žฅ๋ฉด์—์„œ WebGL์ด ์••๋„์ ์œผ๋กœ ์šฐ์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.โ€

๊ตฌ์ฒด์ ์ธ ์ˆ˜์น˜:

  • WebGPU: 85~90 FPS
  • WebGL: 144 FPS ์œ ์ง€

์ด๋Š” WebGPU๊ฐ€ ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์ด๋ฉฐ, ๋“œ๋ผ์ด๋ฒ„ ์ตœ์ ํ™”์™€ ๊ตฌํ˜„ ์„ฑ์ˆ™๋„ ๋ฉด์—์„œ ๊ฐœ์„ ์ด ํ•„์š”ํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•

WebGPU์—์„œ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ๊ณ ๋ คํ•˜์„ธ์š”:

  • ๋ Œ๋” ๋ฒˆ๋“ค(Render Bundles) ํ™œ์šฉ
  • ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ธฐ๋ฒ• ์ ์šฉ
  • ์ ์ ˆํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ˆ˜ํ–‰

ํ˜„์žฌ๋กœ์„œ๋Š” WebGPU์˜ ์„ฑ๋Šฅ ์ž ์žฌ๋ ฅ์„ ์™„์ „ํžˆ ๋Œ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ํ•™์Šต๊ณผ ๊ฒฝํ—˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๋ธŒ๋ผ์šฐ์ € ์ง€์› ํ˜„ํ™ฉ

WebGL ๋ธŒ๋ผ์šฐ์ € ์ง€์›

WebGL์€ ๊ฑฐ์˜ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์™„์ „ํ•˜๊ฒŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค:

  • ๋ฐ์Šคํฌํ†ฑ: Chrome, Firefox, Safari, Edge ๋ชจ๋‘ ์™„์ „ ์ง€์›
  • ๋ชจ๋ฐ”์ผ: iOS Safari, Chrome Mobile, Samsung Internet ๋ชจ๋‘ ์ง€์›
  • ์•ˆ์ •์„ฑ: 10๋…„ ์ด์ƒ์˜ ๊ฒ€์ฆ๋œ ์•ˆ์ •์„ฑ

WebGPU ๋ธŒ๋ผ์šฐ์ € ์ง€์›

WebGPU๋Š” ์•„์ง ์ œํ•œ์ ์ธ ์ง€์› ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค (2023๋…„ 11์›” ๊ธฐ์ค€):

  • Chrome/Edge: ChromeOS, macOS, Windows์—์„œ ๋ถ€๋ถ„ ์ง€์›
  • Firefox: Windows์—์„œ๋งŒ ํ”Œ๋ž˜๊ทธ ํ™œ์„ฑํ™” ํ•„์š”
  • Safari: ์•„์ง ์‹คํ—˜์  ์ง€์›

์™„์ „ํ•œ ์ง€์›์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • Safari 26 โ†’ 2025๋…„ 9์›” 15์ผ ์˜ˆ์ •
  • Chrome Android 121 โ†’ 2024๋…„ 1์›” 23์ผ
  • Samsung Internet 25 โ†’ 2024๋…„ 4์›” 24์ผ

์‹ค๋ฌด ์ ์šฉ ๊ฐ€์ด๋“œ

WebGL์„ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  1. ๋„“์€ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ
  2. ๊ฒ€์ฆ๋œ ์ƒํƒœ๊ณ„์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  3. ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ์•ˆ์ •์„ฑ์ด ์šฐ์„ ์ธ ํ”„๋กœ์ ํŠธ

WebGPU๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  1. ์ปดํ“จํŠธ ์…ฐ์ด๋”๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ
  2. ์ตœ์‹  GPU ์„ฑ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  3. ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ ์ธ ๊ธฐ์ˆ  ์Šคํƒ์„ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•

ํ˜„์‹ค์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์ ์ง„์  ํ–ฅ์ƒ(Progressive Enhancement) ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค.

async function initGraphicsAPI() {
  if (navigator.gpu) {try {  const adapter = await navigator.gpu.requestAdapter();  if (adapter) {    return await initWebGPU(adapter);  }} catch (error) {  console.warn('WebGPU ์ดˆ๊ธฐํ™” ์‹คํŒจ, WebGL๋กœ ๋Œ€์ฒด:', error);}
  }

  // WebGL ํด๋ฐฑ
  return initWebGL();
}

ํ•™์Šต ๋ฆฌ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ

WebGL ํ•™์Šต ์ž๋ฃŒ

  • WebGL Fundamentals: ๊ฐ€์žฅ ํฌ๊ด„์ ์ธ WebGL ํŠœํ† ๋ฆฌ์–ผ
  • Three.js: WebGL์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Babylon.js: 3D ์—”์ง„์œผ๋กœ WebGL ์ถ”์ƒํ™” ์ œ๊ณต

WebGPU ํ•™์Šต ์ž๋ฃŒ

  • MDN WebGPU ๋ฌธ์„œ: ๊ณต์‹ API ๋ ˆํผ๋Ÿฐ์Šค
  • WebGPU Samples: Google ์ œ๊ณต ์˜ˆ์ œ ์ฝ”๋“œ
  • WGSL ์‚ฌ์–‘: ์…ฐ์ด๋”ฉ ์–ธ์–ด ํ•™์Šต ์ž๋ฃŒ

๋ฏธ๋ž˜ ์ „๋ง๊ณผ ๊ฐœ๋ฐœ ํŠธ๋ Œ๋“œ

์›น ๊ทธ๋ž˜ํ”ฝ์Šค์˜ ์ง„ํ™” ๋ฐฉํ–ฅ

WebGPU๋Š” ๋‹จ์ˆœํ•œ WebGL์˜ ๋Œ€์ฒด์žฌ๊ฐ€ ์•„๋‹ˆ๋ผ,
์›น ํ”Œ๋žซํผ์˜ ์ปดํ“จํŒ… ๋Šฅ๋ ฅ์„ ํ™•์žฅํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์Œ ๋ถ„์•ผ์—์„œ ํฐ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ฌ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค:

  1. ์›น ๊ธฐ๋ฐ˜ ๋จธ์‹ ๋Ÿฌ๋‹ โ€” TensorFlow.js์™€์˜ ํ†ตํ•ฉ
  2. ์‹ค์‹œ๊ฐ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ โ€” ๋ฌผ๋ฆฌยท์œ ์ฒด ์—ญํ•™ ๋“ฑ
  3. ๊ณ ๊ธ‰ ์‹œ๊ฐํ™” โ€” ๊ณผํ•™ ๋ฐ์ดํ„ฐ, ์˜๋ฃŒ ์˜์ƒ ๋“ฑ

WebCodecs API์™€์˜ ํ†ตํ•ฉ

WebGPU๋Š” WebCodecs API์™€ ๊ธด๋ฐ€ํžˆ ํ†ตํ•ฉ๋˜์–ด ๋น„๋””์˜ค ์ฒ˜๋ฆฌ, ์‹ค์‹œ๊ฐ„ ์˜์ƒ ํŽธ์ง‘, ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ ๋“ฑ์—์„œ๋„ ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์„ ์—ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์ƒํƒœ๊ณ„์˜ ๋ณ€ํ™”

ํ–ฅํ›„ 5๋…„ ๋‚ด์— WebGPU๋Š” WebGL๊ณผ ํ•จ๊ป˜ ์›น ๊ทธ๋ž˜ํ”ฝ์Šค ์ƒํƒœ๊ณ„์˜ ์–‘๋Œ€ ์ถ•์œผ๋กœ ์ž๋ฆฌํ•  ์ „๋ง์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ณผ๊ฑฐ jQuery์—์„œ React/Vue๋กœ์˜ ์ „ํ™˜๊ณผ ์œ ์‚ฌํ•œ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.


์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

WebGPU ํ•™์Šต์ด ์–ด๋ ต๋‚˜์š”?

WebGL ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‘ API ๋ชจ๋‘ GPU์—์„œ ์…ฐ์ด๋”๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์„ ๊ฐ€์ง€๋ฉฐ, ๋‹ค๋งŒ ์„ค๊ณ„ ์ฒ ํ•™๊ณผ ์…ฐ์ด๋”ฉ ์–ธ์–ด(WGSL)์— ์ ์‘ํ•  ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์–ธ์ œ WebGL์—์„œ WebGPU๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ด์•ผ ํ•˜๋‚˜์š”?

์ง€๊ธˆ ๋‹น์žฅ ์„œ๋‘๋ฅผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๋ธŒ๋ผ์šฐ์ € ์ง€์›์ด ์•ˆ์ •ํ™”๋˜๊ณ  ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋œ ์ดํ›„ ์ ์ง„์ ์ธ ์ „ํ™˜์ด ํ˜„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

WebGPU ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ์€?

WebGPU๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ GPU์˜ ์ตœ์†Œ ๊ณตํ†ต ๋ถ„๋ชจ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ณ ์„ฑ๋Šฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ limits๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ ์บ”๋ฒ„์Šค ๊ด€๋ฆฌ๋ฅผ ์ง์ ‘ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ WebGL๋ณด๋‹ค ์ดˆ๊ธฐ ์„ค์ •์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค.


๐Ÿ’ก ํ˜„๋ช…ํ•œ ๊ธฐ์ˆ  ์„ ํƒ์„ ์œ„ํ•œ ๊ฒฐ๋ก 

WebGL๊ณผ WebGPU๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ ๊ฐ•์ ๊ณผ ์ ์šฉ ๋ถ„์•ผ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” WebGL์˜ ์•ˆ์ •์„ฑ + WebGPU์˜ ์ž ์žฌ๋ ฅ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•ด ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ˜„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์‹ค๋ฌด์—์„œ๋Š” WebGL๋กœ ๊ธฐ๋ฐ˜์„ ๋‹ค์ง€๋ฉด์„œ, WebGPU์˜ ๋ฐœ์ „์„ ์ง€์ผœ๋ณด๊ณ  ์ ์ง„์ ์œผ๋กœ ๋„์ž…ํ•˜๋Š” ์ „๋žต์ด ์ข‹์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ ์ปดํ“จํŠธ ์…ฐ์ด๋”๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋‚˜ ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ ์ธ ๊ธฐ์ˆ  ์Šคํƒ์„ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ WebGPU๋ฅผ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.


References

Webgl์™€ Webgpu์˜ ๊ฐœ๋… ๋ฐ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž