문과 식

문과 식

문은 TypeScript의 것이고, 각각이 옆의 WGSL과 같은 뜻입니다. 생성된 텍스트는 빌드 시점에 컴파일한 파일 하나에서 가져왔으므로 괄호와 접힌 상수도 생성기가 쓴 그대로입니다.

WGSLTypeShade설명
let a = (uv.x * 2.0);
const a = uv.x * 2.

WGSL의 let은 그대로 있는 값이고, TypeScript에서 그 뜻을 말하는 것이 const입니다.

var b: f32 = uv.y;
let b = uv.y

WGSL의 var는 바뀌는 지역 변수입니다. 초기값 없는 let b: f32가 그것을 선언하고 값은 나중 대입에 맡깁니다. 첫 대입 전에 읽으면 WGSL은 영으로 채운 값을 주고 GLSL은 정해지지 않은 값을 주므로, 읽기 전에 대입하십시오(규칙 7.6컴파일러가 아직 적용하지 않음).

for (var i: i32 = 0; (i < 4); i = (i + 1)) {
for (let i: i32 = 0; i < 4; i++)

for는 횟수가 세어지는 형태여야 합니다. 정수 유도 변수와 상수 증감이 있고, 종료 조건은 본문이 쓰지 않는 경계와 변수를 비교합니다. 시작값과 경계는 런타임 값이어도 되고, 반복 횟수에 상한이 없습니다. 증감에는 +=, -=, *=, /=를 쓸 수 있습니다.

for (var _w: i32 = 0; (w < 4); _w = (_w + 1)) {
while (w < 4)

while이 loop 자리를 대신합니다. 열린 루프라서 조건이 거짓이 되거나 break나 return을 만나면 끝나고, while (true)는 본문에 둘 중 하나가 있어야 합니다.

switch i32(b) {
switch (i32(b))

case는 저마다 break로 끝냅니다. WGSL의 case에는 없는 문이며, 하향 변환이 떼어 냅니다. 본문 끝까지 실행이 이어질 수 있는 case는 TypeScript에서 다음 case로 넘어가 실행되므로 거절합니다(TS8017). 마지막 case에는 break가 필요 없습니다. 레이블은 한 번만 쓸 수 있는 정수 상수입니다. 본문 하나 위에 레이블 두 개를 겹쳐 쓰면 선택자가 둘인 case 하나가 되며, WGSL에서는 case 0, 1:로 나옵니다.

let c = select(b, a, (uv.x > 0.5));
const c = uv.x > 0.5 ? a : b

WGSL에는 삼항 연산자가 없어서 스칼라와 벡터 조건식은 select가 됩니다. 첫 인자가 조건이 고르지 않은 쪽입니다. 구조체나 배열을 고르는 조건식은 슬롯과 if로 풀립니다. 그 경우에는 어느 타깃에도 연산자가 없기 때문입니다.

bump(u32(b));
bump(u32(b))

결과를 버리고 동작만 보고 부르는 함수입니다.

_ = atomicAdd(&counter, 1u);
atomicAdd(counter, 1)

같은 방식으로 결과를 버린 내장 함수 호출에는 가짜 대입이 붙습니다. Tint가 그런 내장 함수를 모두 @must_use로 읽기 때문입니다.

discard;
discard

같은 낱말이고 같은 문입니다.

struct VsIn {
@location(0) pos: vec3<f32>,
}
class VsIn { @location(0) pos: vec3 }

WGSL 구조체는 클래스입니다. 객체 모양의 타입 별칭과 인터페이스도 같은 선언에 닿습니다.

fn bump(i: u32) {
function bump(i: u32): void

스테이지 데코레이터가 붙지 않은 함수는 모듈의 헬퍼입니다.

이 페이지 편집 문제 보고