셰이더 언어는 GPU에서 실행되는 그래픽 프로그램을 작성하는 언어다. 정점(Vertex) 처리, 픽셀(Fragment/Pixel) 색상 계산, 범용 GPU 연산(Compute)에 사용된다.
셰이더 언어 비교
| 언어 | 생태계 | 특징 |
|---|
| GLSL | OpenGL, WebGL | C 기반, 크로스플랫폼 |
| HLSL | DirectX | Microsoft, 게임 산업 표준 |
| MSL | Metal (Apple) | Objective-C++와 통합 |
| WGSL | WebGPU | 안전성 중심, 웹 표준 |
| SPIRV | Vulkan/OpenCL | 이진 IR (중간 형식) |
GLSL (OpenGL Shading Language)
glsl
// ===== 버텍스 셰이더 =====
# version 450 core
layout(location = 0) in vec3 aPosition; // CPU에서 전달
layout(location = 1) in vec2 aTexCoord;
uniform mat4 uMVP; // 모델-뷰-프로젝션 행렬
out vec2 vTexCoord; // 프래그먼트 셰이더로 전달
void main() {
gl_Position = uMVP * vec4(aPosition, 1.0);
vTexCoord = aTexCoord;
}
// ===== 프래그먼트 셰이더 =====
# version 450 core
in vec2 vTexCoord;
uniform sampler2D uTexture;
uniform float uTime;
out vec4 fragColor;
void main() {
vec4 color = texture(uTexture, vTexCoord);
// 물결 효과
float wave = sin(vTexCoord.x * 20.0 + uTime) * 0.05;
vec2 distorted = vTexCoord + vec2(0.0, wave);
fragColor = texture(uTexture, distorted);
}
WGSL (WebGPU Shading Language)
wgsl
// 구조체 정의
struct VertexInput {
@location(0) position: vec3f,
@location(1) uv: vec2f,
}
struct VertexOutput {
@builtin(position) position: vec4f,
@location(0) uv: vec2f,
}
// 버텍스 셰이더
@vertex
fn vs_main(in: VertexInput) -> VertexOutput {
var out: VertexOutput;
out.position = vec4f(in.position, 1.0);
out.uv = in.uv;
return out;
}
// 프래그먼트 셰이더
@group(0) @binding(0) var t: texture_2d<f32>;
@group(0) @binding(1) var s: sampler;
@fragment
fn fs_main(in: VertexOutput) -> @location(0) vec4f {
return textureSample(t, s, in.uv);
}
// 컴퓨트 셰이더 (GPGPU)
@group(0) @binding(0) var<storage, read_write> data: array<f32>;
@compute @workgroup_size(64)
fn cs_main(@builtin(global_invocation_id) id: vec3u) {
let i = id.x;
data[i] = data[i] * 2.0; // 배열 원소 2배
}
셰이더 파이프라인
CPU → 버텍스 버퍼 → [버텍스 셰이더]
↓ 래스터화
[프래그먼트 셰이더]
↓
프레임버퍼 → 화면
컴퓨트 셰이더: 렌더링 파이프라인 외부 병렬 연산
→ AI 추론, 물리 시뮬레이션, 이미지 처리
관련 문서