함수와 연산자
호출은 중립 이름 하나로 컴파일러를 통과하고 백엔드마다 자기 표기를 씁니다. 그래서 적어야 할 이름은 오른쪽 칸의 것입니다. 아래는 GLSL 작성자가 특히 많이 찾는 이름들입니다.
dFdx(a)dpdx(a)WGSL 이름으로 부르는 같은 미분입니다.
dFdy(a)dpdy(a)축만 다른 같은 미분입니다.
dFdx(a)dpdxCoarse(a)coarse와 fine 변형은 WGSL에서는 이름을 유지하고 여기서는 하나로 합쳐집니다. 이 타깃에는 축마다 미분이 하나뿐이기 때문입니다.
dFdy(a)dpdyFine(a)같은 방식으로 합쳐집니다.
mod(a, b)mod(a, b)나누는 수 쪽으로 내림한 나머지이고, 이 타깃의 mod가 이미 그것입니다. % 연산자는 다른 쪽입니다.
texture(a, c)textureSample(a, b, c)결합 샘플러가 이미 샘플러를 들고 있으므로 샘플러 인자가 사라집니다.
texelFetch(a, b, int(c))textureLoad(a, b, c)정수 좌표와 밉 레벨로 텍셀 하나를 읽습니다.
uvec2(textureSize(a, 0))textureDimensions(a)크기가 부호 없는 값으로 돌아오므로, 생성기가 이 타깃의 부호 있는 답을 감쌉니다.
faceforward(a, b, c)faceForward(a, b, c)표기만 다릅니다.
inversesqrt(a)inverseSqrt(a)이것도 표기만 다릅니다.
roundEven(a)round(a)두 타깃이 함께 쓰는 반올림은 절반을 짝수 쪽으로 보내는 방식입니다.
_popcnt(a)countOneBits(a)이 타깃에는 비트 내장 함수가 하나도 없어서, 생성기가 여기에 있는 시프트와 마스크로 작은 함수를 정의합니다.
_msb(a)firstLeadingBit(a)그런 함수가 하나 더 있고, 부르는 모듈에만 정의가 들어갑니다.
연산자도 같은 방식으로 갈립니다. 벡터 두 개를 비교할 때는 연산자로 적고 이 타깃에는 함수로 도착하며, 성분마다 고르는 연산은 양쪽 모두 select입니다.
float floorMod = mod(uv.x, 0.5);const floorMod = mod(uv.x, 0.5)나누는 수 쪽으로 내림한 나머지라 부호가 나누는 수를 따릅니다.
float truncMod = (uv.x - 0.5 * trunc(uv.x / 0.5));const truncMod = uv.x % 0.5잘라 내는 나머지라 부호가 나뉘는 수를 따릅니다. 이 타깃에는 실수에 쓰는 %가 없어서 생성기가 식을 풀어서 적습니다.
bvec2 below = lessThan(uv, vec2(0.5, 0.25));const below: vec2b = uv < vec2(0.5, 0.25)벡터 비교는 이 타깃에서는 함수이고 저쪽에서는 연산자입니다. 그래서 소스에는 연산자로 적습니다.
bvec2 same = equal(uv, vec2(0.75, 0.125));const same: vec2b = uv === vec2(0.75, 0.125)같은 방식이고, TypeScript가 받는 것은 엄격 비교 쪽입니다.
float picked = (below.x ? uv.y : uv.x);const picked = select(uv.x, uv.y, below.x)스칼라 선택은 여기서는 삼항 연산자이고 WGSL에서는 select라, 이름 하나가 양쪽을 맡습니다.
vec2 blended = mix(vec2(0.0, 0.0), vec2(1.0, 1.0), below);select(vec2(0., 0.), vec2(1., 1.), below)불리언 벡터로 성분마다 고르는 연산은 이 타깃에서 mix이고, GLSL 작성자가 이미 쓰던 모양이 그것입니다.
컴파일러가 표기할 수 있는 내장 함수와 두 타깃에서 각각 생성하는 텍스트는 내장 함수 표에 있습니다.