타입
이 페이지에서

Types: TypeScript 타입에서 GPU 값으로

TypeShade는 TypeScript의 타입 표면을 출발점으로 삼지만 타입의 최종 의미는 GPU 값 모델에 있습니다. 먼저 TypeScript의 structural typing과 type alias를 이해하고, GPU layout metadata가 필요한 경우 class와 field decorator를 사용합니다.

TypeScript에서 출발하기

Type alias는 값의 shape를 이름 붙이는 방법입니다. TypeShade에서도 이 표면을 유지하지만, 사용 가능한 타입과 표현식은 shader semantics가 결정합니다.

1. 타입 별칭은 plain data에 사용

필드에 decorator가 필요 없다면 type alias가 가장 단순한 표현입니다. 여러 함수의 인자나 반환값에서 같은 GPU value shape를 공유할 때도 유용합니다.

type Camera = {
view: mat4
pos: vec3
}

2. class는 struct와 그 함수들

TypeShade의 class는 GPU struct이면서 그 곁에 쓴 함수들입니다. 필드는 호스트가 채우는 바이트입니다. 생성자와 메서드와 static 함수는 각각 평범한 함수로 내려가서, new Ray(o, d)는 Ray_new를 부르고 r.at(t)는 Ray_at(r, t)를 부릅니다. 그 사이에 살아 있는 객체는 없습니다.

class VsIn {
position: vec3
uv: vec2
}

3. 필드 decorator는 레이아웃을 설명

필드에는 파이프라인의 자리에 연결하는 @location과 @builtin을 붙이고, 스테이지 사이를 오가는 값이나 출력의 성질을 정하는 @interpolate, @invariant, @blend_src도 붙일 수 있습니다. @align은 읽고 나서 거부하며 @size, @offset, @ignore는 컴파일러가 아는 어트리뷰트가 아닙니다. 받아들이는 전체 집합은 @vertex, @fragment, @compute, @builtin, @location, @interpolate, @invariant, @blend_src, @diagnostic입니다.

class VsOut {
@builtin("position") position: vec4
@location(0) uv: vec2
}

4. TypeScript의 class와 다른 점

  • 진입점은 최상위 함수이고 메서드가 아닙니다.
  • 인스턴스 필드가 없는 class도 생성할 수 있으며 메서드, 접근자와 static 멤버를 가질 수 있습니다. 호스트에서는 {} 값입니다. 리플렉션은 소스에 필드를 추가하지 않고 GPU 내부 표현의 크기를 반영합니다. std430에서는 4바이트, std140에서는 16바이트입니다.
  • 베이스 타입으로 읽기만 하며 메서드 선택이 같다고 컴파일러가 입증하면 파생 값을 베이스 class 자리에 쓸 수 있습니다. 메서드 재정의, 수신 객체의 변경이나 별칭을 통한 관찰 가능한 변경이 있으면 구체적인 타입을 쓰거나 지원 범위 밖에 남습니다.
  • getter와 setter는 각각 제 함수로 내려가고, 생성자는 TypeScript처럼 클래스마다 하나입니다.
  • new는 함수 본문 안에서 값을 만들고, 모듈 상수는 객체 리터럴로 씁니다.
  • 데코레이터가 필요한 필드가 없다면 type alias가 더 명확합니다.

5. 개념 대응표

TypeScriptTypeShade
type alias / object shapeGPU value shape
class fieldsGPU struct fields
class method구조체를 첫 매개변수로 받는 함수
new만들어진 생성자 함수 호출
extends with super베이스 필드를 이어 붙이고 본문을 다시 내림
decorator metadataGPU layout / stage metadata
runtime object해당하지 않음
structural compatibilityshader 타입 검사 범위에서 적용

6. 실제 entry point와 연결하기

struct를 정의한 뒤 entry point 매개변수에서 사용할 수 있습니다. 이때 값의 shape와 field metadata가 shader 입력의 의미를 결정합니다.

class VsIn {
@location(0) position: vec3
}
@vertex
export function vs(vin: VsIn): vec4 {
return vec4(vin.position, 1)
}

다음: Functions

이 페이지 편집 문제 보고