---
title: "wgsl-rs: Rust 코드를 GPU 셰이더(WGSL)로 동시에 돌리는 매크로 크레이트"
published: 2026-03-04T23:26:21.000Z
canonical: https://jeff.news/article/246
---
# wgsl-rs: Rust 코드를 GPU 셰이더(WGSL)로 동시에 돌리는 매크로 크레이트

Rust-GPU의 복잡한 프로비저닝과 nightly 종속 문제를 해결하기 위해, #[wgsl] 매크로로 Rust 코드를 CPU와 WGSL 양쪽에서 동시에 실행할 수 있는 크레이트를 만들었음. stable Rust에서 동작하고 셰이더를 cargo test로 유닛 테스트할 수 있음.

## Rust-GPU의 한계, 그리고 wgsl-rs의 등장

- Renderling이라는 실시간 3D 렌더러를 만드는 개발자가 Rust-GPU를 쓰다가 한계를 느끼고 직접 `wgsl-rs`라는 크레이트를 만들었음. 핵심은 **Rust 코드에 `#[wgsl]` 매크로를 붙이면 같은 코드가 CPU에서는 Rust로, GPU에서는 WGSL로 동시에 돌아가는 것**

- Rust-GPU의 장점은 확실함 — 모듈 시스템, 타입 체킹, 제네릭, 에디터 툴링 등 Rust의 모든 이점을 셰이더에서 쓸 수 있음. 근데 현실적인 고통이 만만치 않음:
  - 커스텀 컴파일러 백엔드 프로비저닝이 번거로움
  - 특정 nightly Rust 컴파일러에 종속
  - `spirv-std`가 2년 넘게 업데이트 안 됨
  - CPU 코드와 GPU 코드(SPIR-V)의 이중 컴파일 + 링킹 필요
  - `while` 루프, `for` 루프, `transmute` 등 안 되는 것들을 부딪혀봐야 알게 됨

- 게다가 Rust-GPU 나머지 메인테이너들이 "Vectorware"라는 AI/범용 컴퓨팅 스타트업을 차리면서 커뮤니케이션이 뜸해짐. 작가는 그래픽/사운드/게임 쪽이라 방향이 갈린 거임

## wgsl-rs가 주는 것

- **stable Rust에서 동작**. nightly 필요 없음. `cargo add wgsl-rs` 하면 끝
- **컴파일 타겟이 하나**. SPIR-V 바이너리 만들고 다시 링크하는 과정 없이, proc macro가 컴파일 타임에 WGSL 문자열을 생성
- **생성된 WGSL이 사람이 읽을 수 있는 수준**. Rust 코드와 거의 1:1 대응되어서 GPU 디버깅 시 추론이 가능
- **셰이더를 `cargo test`로 유닛 테스트** 가능. CPU에서 같은 로직이 그대로 돌아가니까 물리 연산, 컬링 같은 건 프로덕션에서도 CPU 버전을 쓸 수 있음
- `linkage-wgpu` 피처를 켜면 wgpu 보일러플레이트(버퍼 디스크립터, 바인드 그룹 레이아웃, 셰이더 모듈 생성 등)까지 자동 생성

> [!TIP]
> standalone 모듈은 컴파일 타임에 naga로 WGSL 검증까지 해주고, 에러를 Rust 소스 스팬에 매핑해줌. 다른 `#[wgsl]` 모듈을 import하는 경우에는 `cargo test`로 검증

## 트레이드오프

- **WGSL만 지원**. Rust-GPU는 SPIR-V → Vulkan/OpenGL/Metal 다 되지만, wgsl-rs는 WebGPU(wgpu) 한정
- **더 엄격한 Rust 서브셋**: 트레이트 없음, 제네릭 없음, 클로저/이터레이터 없음. 제네릭 없는 게 특히 고통스럽다고 직접 언급
- 바인드리스 리소스, 메시 셰이더, 레이트레이싱 같은 최신 GPU 기능은 WGSL 스펙 범위 밖이라 불가

- 저자의 포인트: wgsl-rs와 Rust-GPU는 양자택일이 아님. wgsl-rs로 빠르게 시작하고, 벽에 부딪히면 Rust-GPU로 넘어가면 됨. 2026년 로드맵은 crates.io 베타 릴리스 → GPU 슬랩 할당(crabslab/craballoc) → GPU 가속 ECS(podecs) → Renderling 내부 재작성 → GPU 레이트레이서 순서

## 핵심 포인트

- Rust-GPU의 한계(nightly 종속, 이중 컴파일, spirv-std 2년간 미업데이트)를 대체
- stable Rust에서 동작, cargo add로 설치 끝
- 같은 Rust 코드가 CPU에서는 네이티브, GPU에서는 WGSL로 실행
- 생성 WGSL이 human-readable하고 naga로 컴파일 타임 검증
- 트레이드오프: 제네릭/트레이트 없음, WGSL(WebGPU) 한정

## 인사이트

Rust-GPU 대비 80/20 파레토 접근. 제네릭 없는 게 고통스럽지만 프로비저닝 고통이 0인 건 실질적 생산성 향상.
