ģ°Øģøė ģ¹ ź·øėķ½ APIģø WebGPU넼 ė§ė볓ģøģ. ź¹ė¤ė”ģ“ ģ ķ리ģ¼ģ“ģ ģ ģķ ķģķ ģ±ė„ź³¼ źø°ė„ģ ģ ź³µķ©ėė¤. WebGPUģ ģķ¤ķ ģ², ģ“ģ , ģ¹ ź°ė°ģ ėÆøģ¹ ģ ģ¬ģ ģķ„ģ ėķ“ ģģ볓ģøģ.
WebGPU: ģ¹ģģ ź³ ģ±ė„ ź·øėķ½ź³¼ 컓ķØķ ģ ģ ģ¬ė „ģ ė°ķķė¤
ģ¹ģ ģ ģ ģø ģ½ķ ģø ģ ėØģķ ģķøģģ©ģ ķØģ¬ ė°ģ“ėģ“ ė°ģ ķ“ ģģµėė¤. ģ¤ėė ģ¹ ģ ķ리ģ¼ģ“ģ ģ ė³µģ”ķ ģ뮬ė ģ“ģ , ėŖ°ģ ķ ź²ģ, ģ źµķ ė°ģ“ķ° ģź°ķ, ģ¬ģ§ģ“ 머ģ ė¬ė ģķ¬ė”ėź¹ģ§ ģ§ģķ©ėė¤. ģ“ė¬ķ ź¹ė¤ė”ģ“ ģ ķ리ģ¼ģ“ģ ė¤ģ ģµģ ź·øėķ½ ģ²ė¦¬ ģ„ģ¹(GPU)ģ ėŖØė ģ±ė„ģ ģ ź·¼ķ“ģ¼ ķė©°, ė°ė” ģ“ ģ§ģ ģģ WebGPUź° ė±ģ„ķ©ėė¤.
WebGPUė 묓ģģøź°?
WebGPUė ź³ źø ź·øėķ½ ė ėė§ ė° ė²ģ© ź³ģ°ģ ģķ“ ģµģ GPU źø°ė„ģ ė øģ¶ķė ģė”ģ“ ģ¹ APIģ ėė¤. ģ“ė WebGLģ ķģ źø°ģ ė” ģ¤ź³ėģģ¼ė©°, WebGLģ ķź³ė„¼ ķ“ź²°ķź³ ģµģ GPUģ źø°ė„ģ ķģ©ķźø° ģķ ė ķØģØģ ģ“ź³ ź°ė „ķ ģøķ°ķģ“ģ¤ė„¼ ģ ź³µķ©ėė¤.
OpenGL ES 3.0ģ źø°ė°ģ¼ė” ķė WebGLź³¼ ė¬ė¦¬, WebGPUė ģµģ GPU źø°ė„ź³¼ ģķ¤ķ ģ²ė„¼ ķģ©ķėė” ģ²ģė¶ķ° ģ¤ź³ėģģµėė¤. ė¤ģź³¼ ź°ģ ģ“ģ ģ ģ ź³µķ©ėė¤:
- ķ„ģė ģ±ė„: WebGPUė ė ķØģØģ ģø API ģ¤ź³, ģ¤ė²ķ¤ė ź°ģ, ģµģ ķė 리ģģ¤ ź“리 ėė¶ģ WebGLė³“ė¤ ķØģ¬ ė°ģ“ė ģ±ė„ģ ģ ź³µķ©ėė¤.
- ģµģ GPU źø°ė„: WebGPUė GPUģģģ ė²ģ© ź³ģ°(GPGPU)ģ ź°ė„ķź² ķė 컓ķØķø ģ °ģ“ėģ ź°ģ ź³ źø GPU źø°ė„ģ ėķ ģ ź·¼ģ ģ ź³µķ©ėė¤.
- ķ¬ė”ģ¤ķė«ķ¼ ķøķģ±: WebGPUė ė¤ģķ ģ“ģ 첓ģ (Windows, macOS, Linux, Android, iOS)ģ źø°źø°ģģ ģ¼ź“ėź² ģėķėė” ķ¬ė”ģ¤ķė«ķ¼ģ¼ė” ģ¤ź³ėģģµėė¤.
- 볓ģ ė° ģģ ģ±: WebGPUė ģ ģ± ģ½ėė”ė¶ķ° ģ¬ģ©ģ넼 볓ķøķź³ ģ¹ ģ ķ리ģ¼ģ“ģ ģ ģģ ģ 볓ģ„ķźø° ģķ“ ź°ė „ķ ė³“ģ źø°ė„ģ ķµķ©ķ©ėė¤.
- 미ė ėė¹: WebGPUė ķģ„ ź°ė„ķėė” ģ¤ź³ėģ“ ķ„ķ GPU źø°ģ ė°ģ ģ ģ ģķ ģ ģģµėė¤.
WebGPUģ ķµģ¬ ź°ė
WebGPUģ ķµģ¬ ź°ė ģ ģ“ķ“ķė ź²ģ ź³ ģ±ė„ ģ¹ ģ ķ리ģ¼ģ“ģ ź°ė°ģ ė§¤ģ° ģ¤ģķ©ėė¤. ė¤ģģ ėŖ ź°ģ§ ķģ źµ¬ģ± ģģģ ėė¤:
1. ėė°ģ“ģ¤(Device)ģ ķ(Queue)
ėė°ģ“ģ¤(device)ė GPUģģ ģ°ź²°ģ ėķė ėė¤. ģ“ė GPUģ ģķø ģģ©ķź³ ė¦¬ģģ¤ė„¼ ģģ±ķźø° ģķ źø°ė³ø ģøķ°ķģ“ģ¤ģ ėė¤. ķ(queue)ė ģ¤ķķ ėŖ ė ¹ģ GPUģ ģ ģ¶ķė ė° ģ¬ģ©ė©ėė¤.
ģģ:
// Acquire a GPU adapter
const adapter = await navigator.gpu.requestAdapter();
// Request a device from the adapter
const device = await adapter.requestDevice();
// Get the queue for submitting commands
const queue = device.queue;
2. ė²ķ¼(Buffers)
ė²ķ¼(Buffers)ė ė°ģ“ķ°ė„¼ ģ ģ„ķė ė° ģ¬ģ©ėė GPU ģģ ė©ėŖØė¦¬ ģģģ ėė¤. ģ ģ ė°ģ“ķ°, ģøė±ģ¤ ė°ģ“ķ°, ģ ėķ¼ ė°ģ“ķ° ė° ė ėė§ź³¼ ź³ģ°ģ ķģķ źø°ķ ģ ķģ ė°ģ“ķ°ė„¼ ģ ģ„ķė ė° ģ¬ģ©ė ģ ģģµėė¤.
ģģ:
// Create a buffer for vertex data
const vertexBuffer = device.createBuffer({
size: vertexData.byteLength,
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
mappedAtCreation: true,
});
// Copy vertex data to the buffer
new Float32Array(vertexBuffer.getMappedRange()).set(vertexData);
vertexBuffer.unmap();
3. ķ ģ¤ģ²(Textures)
ķ ģ¤ģ²(Textures)ė GPUģ ģ ģ„ė ģ“미ģ§ģ ėė¤. ė ėė§ė ź°ģ²“ģ ģź°ģ ėķ ģ¼ģ ģ ź³µķė ė° ģ¬ģ©ėė©°, ėģ“ ė§µģ“ė ģ”°ķ ķ ģ“ėøģ ģ ģ„ķė ė± ė¤ė„ø ėŖ©ģ ģ¼ė”ė ģ¬ģ©ė ģ ģģµėė¤.
ģģ:
// Create a texture
const texture = device.createTexture({
size: [width, height],
format: "rgba8unorm",
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
});
4. ģ °ģ“ė(Shaders)ģ ķģ“ķė¼ģø(Pipelines)
ģ °ģ“ė(Shaders)ė GPUģģ ģ¤ķėė ķė”ź·øėØģ ėė¤. WebGPU ģ °ģ“ė© ģøģ“(WGSL)ė” ģģ±ėė©°, ģ ģ ė°ģ“ķ° ė³ķ, ķ½ģ ģģ ź³ģ° ė° źø°ķ ź·øėķ½ ģģ ģ ė“ė¹ķ©ėė¤. ķģ“ķė¼ģø(pipeline)ģ ģ¬ģ©ķ ģ °ģ“ė, ģ ģ ģ ė „ ķģ, ė ė ķź²ģ ķ¬ķØķģ¬ ģ 첓 ė ėė§ ķė”ģøģ¤ė„¼ ģ ģķ©ėė¤.
ģģ:
// Shader code (WGSL)
const shaderCode = `
@vertex
fn main(@location(0) pos: vec4<f32>) -> @builtin(position) vec4<f32> {
return pos;
}
@fragment
fn main() -> @location(0) vec4<f32> {
return vec4<f32>(1.0, 0.0, 0.0, 1.0); // Red
}
`;
// Create a shader module
const shaderModule = device.createShaderModule({
code: shaderCode,
});
// Create a render pipeline
const pipeline = device.createRenderPipeline({
layout: "auto",
vertex: {
module: shaderModule,
entryPoint: "main",
buffers: [
{
arrayStride: 16,
attributes: [
{
shaderLocation: 0,
offset: 0,
format: "float32x4",
},
],
},
],
},
fragment: {
module: shaderModule,
entryPoint: "main",
targets: [
{
format: presentationFormat,
},
],
},
});
5. ė°ģøė 그룹(Bind Groups)ź³¼ ė°ģøė 그룹 ė ģ“ģģ(Bind Group Layouts)
ė°ģøė 그룹(Bind groups)ģ ķ ģ¤ģ² ė° ģ ėķ¼ ė²ķ¼ģ ź°ģ 리ģģ¤ė„¼ ģ °ģ“ėģ ė°ģøė©ķė ė° ģ¬ģ©ė©ėė¤. ė°ģøė 그룹 ė ģ“ģģ(bind group layout)ģ ė°ģøė©ė 리ģģ¤ģ ģ ķź³¼ ģģ¹ė„¼ ģ§ģ ķģ¬ ė°ģøė ź·øė£¹ģ źµ¬ģ”°ė„¼ ģ ģķ©ėė¤.
ģģ:
// Create a bind group layout
const bindGroupLayout = device.createBindGroupLayout({
entries: [
{
binding: 0,
visibility: GPUShaderStage.FRAGMENT,
texture: {},
},
{
binding: 1,
visibility: GPUShaderStage.FRAGMENT,
sampler: {},
},
],
});
// Create a bind group
const bindGroup = device.createBindGroup({
layout: bindGroupLayout,
entries: [
{
binding: 0,
resource: texture.createView(),
},
{
binding: 1,
resource: sampler,
},
],
});
6. ė ė ķØģ¤(Render Passes)ģ 컓ķØķø ķØģ¤(Compute Passes)
ė ė ķØģ¤(render pass)ė ķ ģ¤ģ²ė ķė©“ź³¼ ź°ģ ė ė ķź²ģ ź·øėķ½ģ ė ėė§ķė ķė”ģøģ¤ė„¼ ģ ģķ©ėė¤. 컓ķØķø ķØģ¤(compute pass)ė GPUģģ ė²ģ© ź³ģ°ģ ģķķė ķė”ģøģ¤ė„¼ ģ ģķ©ėė¤.
ģģ (ė ė ķØģ¤):
// Create a render pass descriptor
const renderPassDescriptor = {
colorAttachments: [
{
view: context.getCurrentTexture().createView(),
loadOp: "clear",
storeOp: "store",
clearValue: [0.0, 0.0, 0.0, 1.0],
},
],
};
// Begin a render pass
const commandEncoder = device.createCommandEncoder();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
passEncoder.setPipeline(pipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.setBindGroup(0, bindGroup);
passEncoder.draw(3);
passEncoder.end();
// Finish the command buffer and submit it to the queue
device.queue.submit([commandEncoder.finish()]);
WebGPU ģ¬ģ©ģ ģ“ģ
WebGPUė WebGLź³¼ ź°ģ 기씓 ģ¹ ź·øėķ½ APIģ ė¹ķ“ ģė§ģ ģ“ģ ģ ģ ź³µķėÆė”, ź¹ė¤ė”ģ“ ģ¹ ģ ķ리ģ¼ģ“ģ ģ ź°ė°ķė ź°ė°ģģź² ė§¤ė „ģ ģø ģ ķģ“ ė©ėė¤:
1. ķ„ģė ģ±ė„
WebGPUė CPU ģ¤ė²ķ¤ė넼 ģµģķķź³ GPU ķģ©ė넼 ź·¹ėķķėė” ģ¤ź³ėģ“ WebGLģ ė¹ķ“ ģė¹ķ ģ±ė„ ķ„ģģ ź°ģ øģµėė¤. ģ“넼 ķµķ“ ź°ė°ģė ė ė³µģ”ķź³ ģź°ģ ģ¼ė” ė°ģ“ė ģ ķ리ģ¼ģ“ģ ģ ė§ė¤ģ“ ė ėģ ė²ģģ ģ„ģ¹ģģ ģķķź² ģ¤ķķ ģ ģģµėė¤.
ģģ: ėģ ź³ķģ ģķ ė³µģ”ķ 3D ėģ ģ뮬ė ģ“ģ ģ ź°ė°ķė ķģ WebGPU넼 ģ¬ģ©ķģ¬ ėģ넼 ė ėģ ėķ ģ¼ź³¼ ķģ¤ź°ģ¼ė” ė ėė§ķ ģ ģģµėė¤. ģ“넼 ķµķ“ ź³ķź°ė¤ģ źµķµ ķØķ“ģ ė¶ģķź³ , ķź²½ ģķ„ģ ģ뮬ė ģ“ģ ķė©°, ģ ģ¬ģ ģø ź°ė° ģė리ģ¤ė„¼ ķ„ģė ģ±ė„ģ¼ė” ģź°ķķ ģ ģģµėė¤.
2. ģµģ GPU źø°ė„ģ ėķ ģ ź·¼
WebGPUė GPUģģģ ė²ģ© ź³ģ°(GPGPU)ģ ź°ė„ķź² ķė 컓ķØķø ģ °ģ“ėģ ź°ģ ģµģ GPU źø°ė„ģ ė øģ¶ķ©ėė¤. ģ“ė ģ¹ ģ ķ리ģ¼ģ“ģ ģ ģė”ģ“ ź°ė„ģ±ģ ģ“ģ“ģ£¼ģ“ ģ“ėÆøģ§ ģ²ė¦¬, 물리 ģ뮬ė ģ“ģ , 머ģ ė¬ėź³¼ ź°ģ ģģ ģ GPUģģ ģ§ģ ģķķ ģ ģź² ķ©ėė¤.
ģģ: ģė£ ģ“ėÆøģ§ ė¶ģģ ģķ ģ¹ źø°ė° ķė«ķ¼ģ ź°ė°ķė ģ°źµ¬ģė¤ģ WebGPUģ 컓ķØķø ģ °ģ“ė넼 ķģ©ķģ¬ ė¶ķ , ķķ°ė§, ģ ķ©ź³¼ ź°ģ ģ“ėÆøģ§ ģ²ė¦¬ ģģ ģ ź°ģķķģ¬ ė ė¹ ė„“ź³ ģ ķķ ģ§ėØģ ź°ė„ķź² ķ ģ ģģµėė¤.
3. ķ„ģė ķ¬ė”ģ¤ķė«ķ¼ ķøķģ±
WebGPUė ė¤ģķ ģ“ģ 첓ģ ģ ģ„ģ¹ģģ ģ¼ź“ėź² ģėķėė” ķ¬ė”ģ¤ķė«ķ¼ģ¼ė” ģ¤ź³ėģģµėė¤. ģ“ė ź°ė° ė° ė°°ķ¬ė„¼ ėØģķķģ¬ ź°ė°ģź° ėØģ¼ ģ½ėė² ģ“ģ¤ė” ė ėģ ģ¬ģ©ģģøµģ ėģģ¼ė” ķ ģ ģź² ķ©ėė¤.
ģģ: ė©ķ°ķė ģ“ģ“ ģØė¼ģø ź²ģģ ģ ģķė ź²ģ ź°ė°ģė WebGPU넼 ģ¬ģ©ķģ¬ ķė ģ“ģ“ź° Windows PC, macOS ė øķøė¶, Android ķėøė¦æ, iOS źø°źø° ģ¤ ė¬“ģģ ģ¬ģ©ķė ź“ź³ģģ“ ź²ģģ“ ė¤ģķ ķė«ķ¼ģģ ģķķź³ ģ¼ź“ėź² ģ¤ķėėė” ė³“ģ„ķ ģ ģģµėė¤.
4. ź°ķė 볓ģ
WebGPUė ģ ģ± ģ½ėė”ė¶ķ° ģ¬ģ©ģ넼 볓ķøķź³ ģ¹ ģ ķ리ģ¼ģ“ģ ģ ģģ ģ 볓ģ„ķźø° ģķ“ ź°ė „ķ ė³“ģ źø°ė„ģ ķµķ©ķ©ėė¤. ģ“ė 민ź°ķ ė°ģ“ķ°ė„¼ ģ²ė¦¬ķź±°ė ģ¤ģķ ģģ ģ ģķķė ģ ķ리ģ¼ģ“ģ ģ ķ¹ķ ģ¤ģķ©ėė¤.
ģģ: ģ¹ źø°ė° ź±°ė ķė«ķ¼ģ ź°ė°ķė źøģµ źø°ź“ģ WebGPUģ ė³“ģ źø°ė„ģ ģ씓ķģ¬ ģ¬ģ©ģ ė°ģ“ķ°ė„¼ 볓ķøķź³ ė¬“ėØ ģ ź·¼ģ ė°©ģ§ķė©°, źøģµ ź±°ėģ ė¬“ź²°ģ±ź³¼ źø°ė°ģ±ģ 볓ģ„ķ ģ ģģµėė¤.
5. 미ė ėė¹
WebGPUė ķģ„ ź°ė„ķėė” ģ¤ź³ėģ“ ķ„ķ GPU źø°ģ ė°ģ ģ ģ ģķ ģ ģģµėė¤. ģ“ė WebGPUė” źµ¬ģ¶ė ģ¹ ģ ķ리ģ¼ģ“ģ ģ“ ėÆøėģ ķėģØģ“ ė° ģķķøģØģ“ģ ķøķģ±ģ ģ ģ§ķģ¬ ė¹ģ©ź³¼ ģź°ģ“ ė§ģ“ ģģėė ģ ė°ģ“ķøģ ķģģ±ģ ģ¤ģ¬ģ¤ėė¤.
ģģ: ģ 문 ė¹ėģ¤ ķøģ§ ėźµ¬ė„¼ ź°ė°ķė ģķķøģØģ“ ķģ¬ė WebGPU넼 ģ±ķķģ¬ ģė”ģ“ GPU źø°ė„ź³¼ ģ±ė„ģ“ ģ¶ģė ėė§ė¤ ģ“넼 ķģ©ķ ģ ģģµėė¤. ģ“넼 ķµķ“ ģķķøģØģ“ģ ź²½ģė „ģ ģ ģ§ķź³ ģ¬ģ©ģģź² ģµģģ ģ±ė„ģ ģ ź³µķ ģ ģģµėė¤.
WebGPUģ ģ¬ģ© ģ¬ė”
WebGPUė ź³ ģ±ė„ ź·øėķ½ ė° ģ»“ķØķ źø°ė„ģ ģźµ¬ķė ź“ė²ģķ ģ ķ리ģ¼ģ“ģ ģ ģ ķ©ķ©ėė¤. ė¤ģģ ėŖ ź°ģ§ 주목ķ ė§ķ ģ¬ģ© ģ¬ė”ģ ėė¤:
1. ź²ģ“ė°
WebGPUė ź°ė°ģź° ķ„ģė ģ±ė„ź³¼ ķģ¤ź°ģ¼ė” ė ģź°ģ ģ¼ė” ė°ģ“ėź³ ėŖ°ģ ź° ģė ģ¹ źø°ė° ź²ģģ ė§ė¤ ģ ģź² ķ©ėė¤. ė ė³µģ”ķ ė ėė§ źø°ģ , ź³ źø ģ °ģ“ė ķØź³¼, ė ė¶ėė¬ģ“ ź²ģ ķė ģ“넼 ź°ė„ķź² ķ©ėė¤.
ģģ: AAAźø ź²ģ ģģ§ģ WebAssemblyģ WebGPU넼 ģ¬ģ©ķģ¬ ģ¹ģ¼ė” ķ¬ķ ķė©“ ź°ė°ģė ģ¬ģ©ģź° ė¤ģ“ķ°ėø ģ ķ리ģ¼ģ“ģ ģ ė¤ģ“ė”ėķģ¬ ģ¤ģ¹ķ ķģ ģģ“ ė ėģ ģ¬ģ©ģģøµģ ėė¬ķ ģ ģģµėė¤. WebGPUģ ķ¬ė”ģ¤ķė«ķ¼ ķ¹ģ±ģ ė¤ģķ ģ„ģ¹ģ ģ“ģ 첓ģ ģģ ģ¼ź“ė ģ±ė„ģ 볓ģ„ķ©ėė¤.
2. ė°ģ“ķ° ģź°ķ
WebGPUė ėģ©ė ė°ģ“ķ° ģøķøė„¼ ģ½ź² ģ²ė¦¬ķ ģ ģė ėķķ ė° ėģ ė°ģ“ķ° ģź°ķ넼 ė§ėė ė° ģ¬ģ©ė ģ ģģµėė¤. ė³µģ”ķ ģ°Øķø, ź·øėķ, ģ§ėģ ģ¤ģź° ė ėė§ģ ķģ©ķģ¬ ģ¬ģ©ģź° ģė”ģ“ ė°©ģģ¼ė” ė°ģ“ķ°ė„¼ ķģķź³ ė¶ģķ ģ ģź² ķ©ėė¤.
ģģ: ź³¼ķ ģ°źµ¬ķģ WebGPU넼 ģ¬ģ©ķģ¬ źø°ķ ė³ķģ ė³µģ”ķ ģ뮬ė ģ“ģ ģ ģź°ķķ ģ ģģµėė¤. ģ“넼 ķµķ“ ė¤ģķ ģė리ģ¤ė„¼ ķģķź³ ģ¬ė¬ ģ ģ± ģ ģ ģ¬ģ ģķ„ģ ė¶ģķ ģ ģģµėė¤. ėģ©ė ė°ģ“ķ° ģøķøė„¼ ģ¤ģź°ģ¼ė” ė ėė§ķė źø°ė„ģ ģ°źµ¬ģė¤ģ“ 기씓 ė°©ė²ģ¼ė”ė ź°ģ§ķźø° ģ“ė ¤ģ“ ķØķ“ź³¼ ģ¶ģøė„¼ ģė³ķė ė° ėģģ“ ė©ėė¤.
3. 머ģ ė¬ė
WebGPUė GPU 컓ķØķ źø°ė„ģ ėķ ģ ź·¼ģ ģ ź³µķģ¬ ėøė¼ģ°ģ ģģ 머ģ ė¬ė ģķ¬ė”ė넼 ź°ģķķė ė° ģ ķ©ķ©ėė¤. ź°ė°ģė ģ ź²½ė§ ķė Ø, ģ¶ė” ģ¤ķ, ėģ©ė ė°ģ“ķ° ģøķø ģ²ė¦¬ģ ź°ģ ģģ ģ GPUģģ ģ§ģ ģķķ ģ ģģµėė¤.
ģģ: ģ¹ źø°ė° ģ“ėÆøģ§ ģøģ ģė¹ģ¤ė„¼ ź°ė°ķė ķģ¬ė WebGPU넼 ģ¬ģ©ķģ¬ ģ“ėÆøģ§ ģ²ė¦¬ ģė넼 ėģ¬ ė ė¹ ė„“ź³ ģ ķķ ź²°ź³¼ė„¼ ģ»ģ ģ ģģµėė¤. ėøė¼ģ°ģ ģģ 머ģ ė¬ė ģģ ģ ģķķė źø°ė„ģ ģ¬ģ©ģź° ģė²ģ ė°ģ“ķ°ė„¼ ģ ė”ėķ ķģ넼 ģģ ź°ģø ģ 볓 볓ķøģ 볓ģģ ķ„ģģķµėė¤.
4. ź³¼ķ 컓ķØķ
WebGPUė ėøė¼ģ°ģ ģģ ź³¼ķ ģ뮬ė ģ“ģ ė° ź³ģ°ģ ź°ģķķė ė° ģ¬ģ©ė ģ ģģµėė¤. ģ°źµ¬ģė¤ģ ė³µģ”ķ ź³ģ°ģ ģķķź³ , 결과넼 ģź°ķķė©°, ģ¤ģź°ģ¼ė” ģ뮬ė ģ“ģ ź³¼ ģķø ģģ©ķ ģ ģģµėė¤.
ģģ: ė¶ģ ėģķģ ģ°źµ¬ķė ģ°źµ¬ģė¤ģ WebGPU넼 ģ¬ģ©ķģ¬ ė¶ģģ ź±°ėģ ģ뮬ė ģ“ģ ķ ģ ģģ¼ė©°, ģ“넼 ķµķ“ 물ģ§ģ ķ¹ģ±ģ ģ“ķ“ķź³ ģė”ģ“ ģ½ė¬¼ģ ģ¤ź³ķ ģ ģģµėė¤. ėøė¼ģ°ģ ģģ ģ뮬ė ģ“ģ ģ ģķķė źø°ė„ģ ģ 문 ģķķøģØģ“ ė° ķėģØģ“ģ ķģģ±ģ ģģ ģ°źµ¬ģė¤ģ“ ė ģ½ź² ķė „ķź³ ģģ ģ ź³µģ ķ ģ ģź² ķ©ėė¤.
5. CAD ė° ģģ§ėģ“ė§
WebGPUė ź°ė°ģź° ė³µģ”ķ 3D ėŖØėø ė° ģ뮬ė ģ“ģ ģ ģ²ė¦¬ķ ģ ģė ģ¹ źø°ė° CAD ė° ģģ§ėģ“ė§ ģ ķ리ģ¼ģ“ģ ģ ė§ė¤ ģ ģź² ķ©ėė¤. ėøė¼ģ°ģ ģģ ģ¤ģź° ė ėė§, ėķķ ķøģ§ ė° ķģ ģ ź°ė„ķź² ķ©ėė¤.
ģģ: ģģ§ėģ“ė§ ķģ¬ė WebGPU넼 ģ¬ģ©ķģ¬ źø°ź³ ģģ¤ķ ģ ģ¤ź³ķź³ ģ뮬ė ģ“ģ ķźø° ģķ ģ¹ źø°ė° ķė«ķ¼ģ ź°ė°ķ ģ ģģµėė¤. ģ“넼 ķµķ“ ģģ§ėģ“ė¤ģ ģģ¹ģ ź“ź³ģģ“ ģ¤ģź°ģ¼ė” ķė”ģ ķøģ ėķ“ ķģ ķ ģ ģģµėė¤. ģ¹ ėøė¼ģ°ģ ź° ģė ėŖØė ģ„ģ¹ģģ ķė«ķ¼ģ ģ ź·¼ķ ģ ģė źø°ė„ģ ģ 문 ģķķøģØģ“ ė° ķėģØģ“ģ ķģģ±ģ ģģ ė¹ģ©ģ ģ ź°ķź³ ķØģØģ±ģ ķ„ģģķµėė¤.
WebGPU vs. WebGL
WebGPUė WebGLģ ķģ źø°ģ ė” ģ¤ź³ėģģ§ė§, ė API ģ¬ģ“ģė ėŖ ź°ģ§ 주ģ ģ°Øģ“ģ ģ“ ģģµėė¤:
- API ģ¤ź³: WebGPUė WebGLģ ė¹ķ“ ė ķėģ ģ“ź³ ķØģØģ ģø API ģ¤ź³ė„¼ ķ¹ģ§ģ¼ė” ķģ¬ CPU ģ¤ė²ķ¤ė넼 ģ¤ģ“ź³ GPU ķģ©ė넼 ķ„ģģķµėė¤.
- GPU źø°ė„: WebGPUė WebGLģģė ģ¬ģ©ķ ģ ģė 컓ķØķø ģ °ģ“ėģ ź°ģ ģµģ GPU źø°ė„ģ ėķ ģ ź·¼ģ ģ ź³µķ©ėė¤.
- ģ±ė„: WebGPUė ķ¹ķ ź¹ė¤ė”ģ“ ģ ķ리ģ¼ģ“ģ ģ ź²½ģ° ģ¼ė°ģ ģ¼ė” WebGLė³“ė¤ ķØģ¬ ė°ģ“ė ģ±ė„ģ ģ ź³µķ©ėė¤.
- ķ¬ė”ģ¤ķė«ķ¼ ķøķģ±: WebGPUė WebGLė³“ė¤ ė ėģ ķ¬ė”ģ¤ķė«ķ¼ ķøķģ±ģ ź°ėė” ģ¤ź³ėģģµėė¤. WebGLģ źµ¬ķģ ė°ė¼ ė¶ģ¼ģ¹ź° ė°ģķ ģ ģģµėė¤.
- ģģ ģ± ė° ė³“ģ: WebGPUė WebGLė³“ė¤ ė ź°ė „ķ ė³“ģ źø°ė„ģ ķµķ©ķ©ėė¤.
ėė¶ė¶ģ ź²½ģ°, ź³ ģ±ė„ ź·øėķ½ ė° ģ»“ķØķ źø°ė„ģ“ ķģķ ģė”ģ“ ģ¹ ģ ķ리ģ¼ģ“ģ ģė WebGPUź° ģ ķøėė ģ ķģ ėė¤. ź·øė¬ė ė ź°ėØķ ģ ķ리ģ¼ģ“ģ ģ“ė ģ“ģ ėøė¼ģ°ģ ģģ ķøķģ±ģ“ ģ£¼ģ ź“ģ¬ģ¬ģø ź²½ģ°ģė ģ¬ģ ķ WebGLģ“ ģ ķ©ķ ģ ģģµėė¤.
WebGPU ģ °ģ“ė© ģøģ“ (WGSL)
WebGPUė WGSL(WebGPU Shading Language)ģ“ė¼ė ģė”ģ“ ģ °ģ“ė© ģøģ“넼 ģ¬ģ©ķ©ėė¤. WGSLģ WebGPU넼 ģķ“ ķ¹ė³ķ ģ¤ź³ė ķėģ ģ“ź³ ģģ ķė©° ģ“ģ ź°ė„ķ ģøģ“ģ ėė¤. Rust ė° HLSLź³¼ ź°ģ ģøģ“ģģ ģź°ģ ė°ģ ģ±ė„ź³¼ ķķė „ ģ¬ģ“ģ ź· ķģ ģ ź³µķ©ėė¤.
WGSLģ 주ģ ķ¹ģ§ģ ė¤ģź³¼ ź°ģµėė¤:
- ģģ ģ±: WGSLģ ė©ėŖØė¦¬ ģģ ģ±ģ ź°ģ¶ź³ ģ¼ė°ģ ģø ģ °ģ“ė ģ·Øģ½ģ ģ ė°©ģ§ķėė” ģ¤ź³ėģģµėė¤.
- ģ“ģģ±: WGSLģ ė¤ģķ GPU ģķ¤ķ ģ²ģģ ģ“ģ ź°ė„ķėė” ģ¤ź³ėģģµėė¤.
- ķķė „: WGSLģ ė³µģ”ķ ģ °ģ“ė넼 ė§ė¤źø° ģķ ķė¶ķ źø°ė„ ģøķøė„¼ ģ ź³µķ©ėė¤.
- ķµķ©: WGSLģ WebGPU APIģ źø“ė°ķź² ķµķ©ėģ“ ģģµėė¤.
WGSLģ ė°°ģ°ė ź²ģ WebGPU ģ ķ리ģ¼ģ“ģ ź°ė°ģ ķģģ ģ ėė¤. GLSL(WebGLģģ ģ¬ģ©ėė ģ °ģ“ė© ģøģ“)ģ ģµģķ ź°ė°ģģź²ė ķģµ ź³”ģ ģ“ ģģ ģ ģģ§ė§, ģģ ģ±, ģ“ģģ±, ģ±ė„ģ ģ“ģ ģ ģ¶©ė¶ķ ķ¬ģ ź°ģ¹ź° ģģµėė¤.
WebGPU ģģķźø°
WebGPUė” ź°ė°ģ ģģķė ¤ė©“ API넼 ģ§ģķė ģµģ ģ¹ ėøė¼ģ°ģ ź° ķģķ©ėė¤. Chrome, Firefox, Safari ėŖØė WebGPUģ ėķ ģ¤ķģ ģ§ģģ ģ ź³µķ©ėė¤. ėķ HTML, JavaScript, CSSģ ź°ģ ģ¹ ź°ė° ź°ė ģ ėķ źø°ė³øģ ģø ģ“ķ“ź° ķģķ©ėė¤.
ģģķė ė° ėģģ“ ėė ėŖ ź°ģ§ 리ģģ¤ė ė¤ģź³¼ ź°ģµėė¤:
- WebGPU ģ¬ģ: ź³µģ WebGPU ģ¬ģģ APIģ ėķ ģģøķ ź°ģ넼 ģ ź³µķ©ėė¤.
- WebGPU ģķ: ė¤ģķ źø°ė„ź³¼ źø°ģ ģ 볓ģ¬ģ£¼ė ģė§ģ WebGPU ģķģ“ ģØė¼ģøģģ ģ ź³µė©ėė¤.
- WebGPU ķķ 리ģ¼: WebGPU ź°ė°ģ źø°ģ“넼 ė°°ģ°ė ė° ėģģ“ ėė ė§ģ ķķ ė¦¬ģ¼ź³¼ źø°ģ¬ź° ģģµėė¤.
- 커뮤ėķ° ķ¬ė¼: ģØė¼ģø ķ¬ė¼ź³¼ 커뮤ėķ°ģģ ģ§ģģ ė°ź³ ģ§ė¬øģ ėķ ėµė³ģ ģ»ģ ģ ģģµėė¤.
ģģ: ź°ėØķ ģ¼ź°ķ ė ėė§
ė¤ģģ WebGPU넼 ģ¬ģ©ķģ¬ ģ¼ź°ķģ ė ėė§ķė ź°ģķė ģģ ģ ėė¤. ģ“ ģģ ė ķµģ¬ ėØź³ģ ģ“ģ ģ ė§ģ¶ź³ ź°ź²°ģ±ģ ģķ“ ģ¼ė¶ ģ¤ė„ ģ²ė¦¬ ė° ģ¤ģ ģ ģėµķģµėė¤. WGSL ģ½ėė ģ¬źø°ģ ģøė¼ģøģ¼ė” ķģėģ§ė§, ģ¤ģ ģ ķ리ģ¼ģ“ģ ģģė ģ¼ė°ģ ģ¼ė” ė³ėģ ķģ¼ģģ ė”ėķź±°ė 문ģģ“ ģģė” ģ ģė©ėė¤.
async function run() {
if (!navigator.gpu) {
console.log("WebGPU is not supported on this browser.");
return;
}
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
console.log("No appropriate GPUAdapter found.");
return;
}
const device = await adapter.requestDevice();
const canvas = document.getElementById("gpu-canvas");
const context = canvas.getContext("webgpu");
const presentationFormat = navigator.gpu.getPreferredCanvasFormat();
context.configure({
device: device,
format: presentationFormat,
});
const vertexShaderCode = `
@vertex
fn main(@location(0) pos: vec2<f32>) -> @builtin(position) vec4<f32> {
return vec4<f32>(pos, 0.0, 1.0);
}
`;
const fragmentShaderCode = `
@fragment
fn main() -> @location(0) vec4<f32> {
return vec4<f32>(1.0, 0.0, 0.0, 1.0); // Red color
}
`;
const vertexShaderModule = device.createShaderModule({
code: vertexShaderCode,
});
const fragmentShaderModule = device.createShaderModule({
code: fragmentShaderCode,
});
const pipeline = device.createRenderPipeline({
layout: 'auto',
vertex: {
module: vertexShaderModule,
entryPoint: "main",
buffers: [{
arrayStride: 8, // 2 floats * 4 bytes each
attributes: [{
shaderLocation: 0, // @location(0)
offset: 0,
format: "float32x2",
}]
}]
},
fragment: {
module: fragmentShaderModule,
entryPoint: "main",
targets: [{
format: presentationFormat
}]
},
primitive: {
topology: "triangle-list"
}
});
const vertices = new Float32Array([
0.0, 0.5, // Vertex 1: Top Center
-0.5, -0.5, // Vertex 2: Bottom Left
0.5, -0.5 // Vertex 3: Bottom Right
]);
const vertexBuffer = device.createBuffer({
size: vertices.byteLength,
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
mappedAtCreation: true,
});
new Float32Array(vertexBuffer.getMappedRange()).set(vertices);
vertexBuffer.unmap();
function render() {
const commandEncoder = device.createCommandEncoder();
const textureView = context.getCurrentTexture().createView();
const renderPassDescriptor = {
colorAttachments: [{
view: textureView,
clearValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 },
loadOp: "clear",
storeOp: "store",
}],
};
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
passEncoder.setPipeline(pipeline);
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.draw(3, 1, 0, 0); // draw 3 vertices, 1 instance
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
// requestAnimationFrame(render); // For continuous rendering
}
render();
}
run();
ģ“ ģģ ė WebGPU넼 ģ¬ģ©ķģ¬ ģ¼ź°ķģ ė ėė§ķė ė° ź“ė Øė źø°ė³ø ėØź³ė„¼ 볓ģ¬ģ¤ėė¤. ģ¬źø°ģė ė¤ģģ“ ķ¬ķØė©ėė¤:
- GPU ģ“ėķ° ė° ėė°ģ“ģ¤ ģ“źø°ķ.
- ė ėė§ģ ģķ ģŗė²ģ¤ 구ģ±.
- ģ ģ ė° ķėź·øėØ¼ķø ģ °ģ“ė넼 ģķ ģ °ģ“ė ėŖØė ģģ±.
- ė ė ķģ“ķė¼ģø ģģ±.
- ģ ģ ė²ķ¼ ģģ± ė° ģ ģ ė°ģ“ķ° ė³µģ¬.
- 커맨ė ģøģ½ė ė° ė ė ķØģ¤ ģģ±.
- ķģ“ķė¼ģø ė° ģ ģ ė²ķ¼ ģ¤ģ .
- ģ¼ź°ķ 그리기.
- 커맨ė ė²ķ¼ė„¼ ķģ ģ ģ¶.
ģ“ ģģ ė ź°ėØķģ§ė§, ė ė³µģ”ķ WebGPU ģ ķ리ģ¼ģ“ģ ģ źµ¬ģ¶ķźø° ģķ źø°ģ“넼 ģ ź³µķ©ėė¤.
WebGPUģ 미ė
WebGPUė ģģ§ ė¹źµģ ģė”ģ“ APIģ“ģ§ė§, ģ¹ ź·øėķ½ź³¼ 컓ķØķ ģ ķģ ķ ģ ģ¬ė „ģ ź°ģ§ź³ ģģµėė¤. WebGPUģ ėķ ėøė¼ģ°ģ ģ§ģģ“ ģ±ģķź³ APIź° ė ė리 ģ±ķėØģ ė°ė¼, ģ°ė¦¬ė ģ“ģ ė³“ė¤ ė ź°ė „ķź³ ėŖ°ģ ź° ģģ¼ė©° ģź°ģ ģ¼ė” ė°ģ“ė ģė”ģ“ ģøėģ ģ¹ ģ ķ리ģ¼ģ“ģ ģ ė³“ź² ė ź²ģ ėė¤.
WebGPUź° ģė¹ķ ģķ„ģ ėÆøģ¹ ź²ģ¼ė” ģģėė ė¶ģ¼ė ė¤ģź³¼ ź°ģµėė¤:
- ģ¹ źø°ė° ź²ģ: WebGPUė ź°ė°ģź° ė¤ģ“ķ°ėø ź²ģģ ķģ§ģ ķģ ķė ė ė³µģ”ķź³ ģź°ģ ģ¼ė” ģøģģ ģø ģ¹ źø°ė° ź²ģģ ė§ė¤ ģ ģź² ķ ź²ģ ėė¤.
- ė°ģ“ķ° ģź°ķ: WebGPUė ėģ©ė ė°ģ“ķ° ģøķøė„¼ ģ½ź² ģ²ė¦¬ķ ģ ģė ė ėķķģ“ź³ ėģ ģø ė°ģ“ķ° ģź°ķģ ģģ±ģ ź°ė„ķź² ķ ź²ģ ėė¤.
- 머ģ ė¬ė: WebGPUė ėøė¼ģ°ģ ģģ 머ģ ė¬ė ģķ¬ė”ė넼 ź°ģķķģ¬ ģ“ėÆøģ§ ģøģ, ģģ°ģ“ ģ²ė¦¬, ģģø” ė¶ģź³¼ ź°ģ ė¶ģ¼ģģ ģė”ģ“ ģ ķ리ģ¼ģ“ģ ģ ź°ė„ķź² ķ ź²ģ ėė¤.
- ź°ģ ė° ģ¦ź° ķģ¤: WebGPUė ģ¹ źø°ė° ź°ģ ė° ģ¦ź° ķģ¤ ź²½ķģ ź°ė„ķź² ķė ė° ķµģ¬ģ ģø ģķ ģ ķ ź²ģ ėė¤.
- ģ 문 ź·øėķ½ ģ ķ리ģ¼ģ“ģ : 3D ėŖØėøė§, ė¹ėģ¤ ķøģ§ ė° źø°ķ ź·øėķ½ ģ§ģ½ģ ģø ģģ ģ ģķ ėźµ¬ė WebGPUģ ģ±ė„ ķ„ģģ¼ė”ė¶ķ° ģ“ģ ģ ģ»ģ ź²ģ ėė¤.
ź²°ė”
WebGPUė ķė GPUģ ķģ ģ¹ģ¼ė” ź°ģ øģ¤ė ź²ģ 첓ģøģ źø°ģ ģ ėė¤. ķ„ģė ģ±ė„, ģµģ GPU źø°ė„ģ ėķ ģ ź·¼, ķ¬ė”ģ¤ķė«ķ¼ ķøķģ±, ź°ķė 볓ģģ ź¹ė¤ė”ģ“ ģ¹ ģ ķ리ģ¼ģ“ģ ģ ź°ė°ķė ź°ė°ģģź² ė§¤ė „ģ ģø ģ ķģ“ ė©ėė¤. WebGPUź° ģ±ģķź³ ė ė리 ģ±ķėØģ ė°ė¼, ģ¹ģ ź³ ģ±ė„ ź·øėķ½ ė° ģ»“ķØķ ķė«ķ¼ģ¼ė” ė³ėŖØģģ¼ ķģ ź³¼ ģ°½ģģ±ģ ģķ ģė”ģ“ ź°ė„ģ±ģ ģ“ģ“ģ¤ ģ ģ¬ė „ģ ź°ģ§ź³ ģģµėė¤.
WebGPU넼 ė°ģė¤ģ“ź³ ģ¹ ź°ė°ģ 미ė넼 ģ“ģ“볓ģøģ!