진입점

진입점과 속성

스테이지 속성은 export한 함수에 붙이는 데코레이터입니다. 셋 중 아무것도 붙지 않은 함수는 헬퍼입니다. @compute가 받는 값은 워크그룹 크기 하나뿐이고 목록으로 적습니다. 컴파일러는 첫 번째 숫자만 나르며, y나 z가 1이 아닌 형태는 거부합니다.

WGSLTypeShade설명
@vertex
@vertex

진입점 하나에 스테이지 데코레이터 하나를 export한 함수에 붙입니다.

@fragment
@fragment

프래그먼트 진입점은 아무것도 반환하지 않아도 됩니다. 스토리지 바인딩에만 쓰는 프로그램이 그런 모양입니다.

@compute @workgroup_size(64)
@compute([64, 1, 1])

목록이 워크그룹 크기입니다. 목록 없는 @compute는 [64, 1, 1]입니다.

@location(0) uv: vec2<f32>
@location(0) uv: vec2

location은 진입점 매개변수와 클래스 필드와 반환 자리에 붙습니다.

-> @builtin(position) vec4<f32>
: vec4

반환 타입이 vec4이면 그 자체가 position builtin을 답니다. 그래서 가장 작은 버텍스 셰이더에는 구조체도 매개변수도 필요 없습니다.

@builtin(position) pos: vec4<f32>
@builtin("position") pos: vec4

구조체를 반환하면 위치는 필드 하나가 나르고, 그 옆에 프로그램이 원하는 만큼 varying을 덧붙입니다.

-> @location(0) vec4<f32>
: vec4

프래그먼트가 단일 값을 반환하면 너비와 상관없이 location 0을 가져갑니다. 그래서 f32, vec2, vec3, vec4가 모두 드로 버퍼 포맷이 됩니다. 구조체 반환은 렌더 타깃이 여럿일 때 쓰는 형태입니다.

버텍스 진입점은 반드시 위치를 만들어 내야 합니다. 반환 타입이 vec4이면 그 자체가 position builtin을 답니다. 구조체를 반환하면 위치는 필드 하나가 나르고, 프로그램이 원하는 만큼 @location varying을 덧붙입니다. position 필드가 없는 구조체 반환, void 반환, vec4가 아닌 단일 타입은 각각 거부되며 어떤 필드나 타입을 적어야 하는지 함께 알려 줍니다.

@builtin(...)의 이름 목록은 WGSL의 것이고 16개를 문자열로 그대로 넘깁니다. 그래서 WGSL 속성은 같은 이름에서 따옴표만 뺀 모양입니다. 매개변수 타입이 이 이름들만 담은 닫힌 유니온이라, 오타는 작성자가 적은 줄에서 tsc 오류가 됩니다. WGSL은 id 하나를 빼고 모두 타입을 고정하므로, 타입 칸이 곧 이 속성이 말해야 하는 타입입니다.

TypeShade타입
@builtin("vertex_index")
u32
@builtin("instance_index")
u32
@builtin("position")
vec4<f32>
@builtin("front_facing")
bool
@builtin("frag_depth")
f32
@builtin("sample_index")
u32
@builtin("sample_mask")
u32
@builtin("primitive_index")
u32
@builtin("local_invocation_id")
vec3<u32>
@builtin("local_invocation_index")
u32
@builtin("global_invocation_id")
vec3<u32>
@builtin("workgroup_id")
vec3<u32>
@builtin("num_workgroups")
vec3<u32>
@builtin("subgroup_invocation_id")
u32
@builtin("subgroup_size")
u32
@builtin("clip_distances")

타입이 고정되지 않은 유일한 id입니다. 배열 길이는 작성자가 정합니다.

GLSL 작성자가 손이 가는 이름 셋에는 대응하는 WGSL builtin이 없습니다. 프런트엔드는 선언 자리에서 각각을 거부하고 받아들이는 이름들을 함께 보여 줍니다. 오른쪽 칸은 백엔드가 속성 이름 뒤에 이어 붙이는 문장이고, 대신 무엇을 쓰면 되는지 말해 줍니다.

WGSL대신 적을 것
@builtin(point_size)

does not exist in WGSL — WebGPU point-list primitives are always 1px. Expand an instanced quad in the vertex stage instead

@builtin(point_coord)

does not exist in WGSL — there is no point-sprite coordinate. Interpolate a @location(n) corner uv from the expanded quad instead

@builtin(frag_coord)

does not exist in WGSL — the fragment-stage framebuffer coordinate (GLSL gl_FragCoord) is @builtin(position) on a fragment entry parameter.

이 페이지 편집 문제 보고