Resources: TypeScript 선언에서 GPU 리소스로
TypeShade resource는 셰이더가 소유하는 JavaScript 객체가 아니라 호스트가 채우는 binding slot입니다. 제품 코드에서는 declare로 이 경계를 명시합니다.
1. TypeScript 선언과 대응하기
TypeScript의 declare가 런타임 값을 만들지 않고 타입 수준의 존재를 설명하듯, TypeShade의 declare는 호스트가 제공하는 GPU resource를 소스에 표현합니다. 다만 TypeShade에서는 uniform<T>와 storage<T>가 GPU 메모리 의미까지 지정합니다.
declare const camera: uniform<Camera>declare const pixels: storage<array<f32>, "read_write">2. declare로 resource 선언
initializer 없이 resource의 타입과 접근 권한을 선언합니다.
3. 접근 권한은 타입에 씁니다
uniform은 읽기 전용이고 uniform<T>는 타입 인자를 하나만 받습니다. storage는 storage<T>면 읽기 전용이고, storage<T, "read_write">면 읽고 쓸 수 있습니다. 접근 권한은 WGSL에서처럼 두 번째 타입 인자로 씁니다. resource는 모두 const로 선언합니다.
| Declaration | Space | Access |
|---|---|---|
declare const x: uniform<T> | uniform | read |
declare const x: storage<T> | storage | read |
declare const x: storage<T, "read_write"> | storage | read_write |
4. binding 순서와 호스트 계약
resource slot은 파일의 declare 순서와 연결됩니다. 실제 binding 번호를 코드에 흩뿌리기보다 컴파일러와 호스트의 reflection 결과를 계약으로 사용하는 방향이 기본입니다.
5. 자주 하는 실수
declare const x: f32처럼uniform<T>나storage<T>없이 선언하지 않습니다.- resource를
let으로 선언하지 않습니다. 컴파일러는declare let x: storage<T>를 거부하고, 대신 쓸declare const줄을 알려 줍니다. - read-only resource에 대입하지 않습니다.
- resource를 class의 bind group처럼 모델링하지 않습니다.