WebGL : 브라우저에서 OpenGL ES 기반 3D 렌더링.
WebGPU : 후계자로 컴퓨트 셰이더와 멀티스레딩 지원.
왜 브라우저가 GPU가 필요한가
-> 브라우저의 진화
초기 웹
- HTML + CSS -> GPU가 2D 화면 그림 -> 애니메이션 = 느린 CPU 연산
Canvas 2D API (2004)
- CPU 기반 2D 드로잉
- 게임/시각화에는 너무 느리다
WebGL 1.0 (2011)
- 브라우저에서 처음으로 GPU 직접 활용
- OpenGL ES 2.0 기반
- 3D 게임, 시각화 가능
WebGL 2.0 (2017)
- OpenGL ES 3.0 기반
- 컴퓨트 셰이더 제외한 대부분 지원
WebGPU (2023~)
- Vulkan/DX12/Metal 수준 저수준 제어
- 컴퓨트 셰이더 완전 지원
- 브라우저에서 본격 GPU 연산 가능
WebGL vs WebGPU
| WebGL | WebGPU |
| OpenGL ES 2.0/3.0 기반 | Vulkan/DX12/Metal 수준 |
| 2011년 등장 | 2023년 정식 출시 |
| 전역 상태 머신 | 명시적 커맨드 버퍼 |
| 싱글 스레드 | 멀티스레드 가능 ( Web Worker ) |
| GLSL ES | WGSL (WebGPU Shading Language) |
| 드라이버가 많이 처리 | 개발자가 직접 제어 |
| 현재 모든 브라우저 지원 | 최신 브라우저에서 지원 중 |
| 안정적이지만 구식 | 복잡하지만 미래 표준 |
브라우저에서 그래픽스 API가 동작하는 방식
브라우저 내부 계층
JavaScript / WASM
↓
WebGL API / WebGPU API
↓
브라우저 내부 변환 레이어
Chorme : ANGLE (WebGL) / Dawn (WebGPU)
Firefox : WebGL 자체 구현 / wgpu
Safari : WebKit WebGL / WebGPU
↓
네이티브 그래픽스 API
Windows : OpenGL -> DX11 / DX12 (ANGLE 변환)
macOS : OpenGL -> Metal (ANGLE/MoltenGL)
Android : OpenGL ES
Linux : OpenGL / Vulkan
↓
GPU 드라이버 -> GPU 하드웨어
브라우저에서 WebGL을 쓰면 실제로는 DX12나 Metal이 실행되는 경우가 많다
WebGL 기본 코드
// HTML Canvas 연결
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl'); // WebGL 1.0
// const gl = canvas.getContext('webgl2'); // WebGL 2.0
// 셰이더 (GLSL ES - OpenGL ES와 동일)
const vertexShaderSource = `
attribute vec4 aPosition;
attribute vec2 aTexCoord;
varying vec2 vTexCoord;
uniform mat4 uMVPMatrix;
void main() {
gl_Position = uMVPMatrix * aPosition;
vTexCoord = aTexCoord;
}
`;
const fragmentShaderSource = `
precision mediump float; // 정밀도 명시
varying vec2 vTexCoord;
uniform sampler2D uTexture;
void main() {
gl_FragColor = texture2D(uTexture, vTexCoord);
}
`;
// 셰이더 컴파일
function createShader(gl, type, source)
{
const shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.complieShader(shader);
return shader;
}
// VBO 생성
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
// 드로우콜
gl.drawArrays(gl.TRIANGLES, 0, 3);
WebGL이 OpenGL ES 2.0 기반인게 코드에서 보인다.
WebGPU - 차세대 표준
// WebGPU 초기화
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
// WGSL 셰이더 (WebGPU Shading Language)
const shaderCode = `
// 버텍스 셰이더
struct VertexOutput {
@builtin(position) position: vec4f,
@location(0) texCoord: vec2f,
}
@group(0) @binding(0) var<uniform> mvpMatrix: mat4x4f;
@vertex
fn vertexMain(
@location(0) position: vec3f,
@location(1) texCoord: vec2f
) -> VertexOutput {
var out: VertexOutput;
out.position = mvpMatrix * vec4f(position, 1.0);
out.texCoord = texCoord;
return out;
}
// 픽셀 셰이더
@group(0) @binding(1) var myTexture : texture_2d<f32>;
@group(0) @binding(2) var mySampler : sampler;
@fragment
fn fragmentMain(in: VertexOutput) -> @location(0) vec4f {
return textureSample(myTexture, mySampler, in.texCoord);
}
`;
// 파이프라인 생성
const pipeline = device.createRenderPipeline({
vertex: {
module: device.createShaderModule({ code: shaderCode }),
entryPoint: 'vertexMain',
},
fragment: {
module: device.createShaderModule({ code: shaderCode }),
entryPoint: 'fragmentMain',
targets: [{ format: 'bgra8unorm' }],
},
});
// 커맨드 버퍼
const commandEncoder = device.createCommandEncoder();
const renderPass = commandEncoder.beginRenderPass(renderPassDescriptor);
renderPass.setPipeline(pipeline);
renderPass.draw(3);
renderPass.end();
device.queue.submit([commandEncoder.finish()]);
WebGPU 코드 구조가 Vulkan이랑 거의 동일하다.
WGSL : WebGPU 셰이더 언어
- Rust 문법에 영향으 ㄹ받음
- 타입 안전성이 강함
- @builtin, @location 어노테이션 시스템
- 브라우저 샌드박스 보안 고려한 설계
- SPIR-V로 컴파일 후 네이티브 API로 전달
Three.js/Babylon.js - WebGL 위의 고수준 프레임워크
WebGL (저수준 API)
- 드로우콜 직접 관리
- 셰이더 직접 작성
- 복잡하지만 완전한 제어
Three.js / Babylon.js ( 고수준 프레임워크 )
- WebGL을 추상화
- UE5 / Unity처럼 씬, 메시, 머티리얼 개념 제공
- 게임 엔진의 브라우저 버전
UE5 대비
- DX12/Vulkan 위의 고수준 엔진
Babylon.js의 특징
- Microsoft 개발
- WebGPU 지원 가장 빠름
- UE5와 유사한 PBR 머티리얼 시스템
컴퓨트 셰이더 : WebGPU의 핵심 혁신
// WebGPU 컴퓨트 셰이더
// 브라우저에서 GPU 병렬 연산 가능
const computeShader = `
@group(0) @binding(0)
var<storage, read_write> data: array<f32>;
@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3u)
{
let index = id.x;
data[index] = data[index] * 2.0; // 병렬 연산
}
`;
// 수백만 개 데이터를 GPU에서 병렬 처리
// AI 추론, 물리 시뮬레이션, 이미지 처리 등등
// TensorFlow.js -> WebGPU 백엔드로 브라우저 AI 추론
// 파티클 시뮬레이션 -> 수백만 파티클을 JS 대신 GPU에서
연결되는 단어들
ANGLE : Almost Native Graphics Layer Engine. Chorme/Firefox/Edge가 WebGL을 DX11/DX12/Metal로 변환하는 레이어. Google이 개발했고 WebGL이 모든 플랫폼에서 동작하는 이유이다.
Dawn : Chrome의 WebGPU 구현체. WebGPU API를 Vulkan/DX12/Metal로 변환. Vulkan의 MoltenVK와 유사한 역할
wgpu : Rust로 작성된 크로스플랫폼 WebGPU 구현체. Firefox WebGPU, 게임 엔진 Bevy의 렌더링 백엔드. WebGPU를 네이티브에서도 사용 가능하게 한다.
SPIR-V : Vulkan/WebGPU의 셰이더 중간 표현. GLSL/HLSL/WGSL을 SPIR-V로 컴파일 후 네이티브 API에 제출. 크로스플랫폼 셰이더의 공통 언어.
'Word' 카테고리의 다른 글
| 컴퓨트 셰이더 ( Compute Shader ) (0) | 2026.07.20 |
|---|---|
| HLSL/GLSL (0) | 2026.07.16 |
| OpenGL ES ( Embedded Systems ) (0) | 2026.07.13 |
| Metal (0) | 2026.07.10 |
| Vulkan (0) | 2026.07.09 |
