함수

함수와 연산자

호출은 중립 이름 하나로 컴파일러를 통과하고 백엔드마다 자기 표기를 씁니다. 그래서 적어야 할 이름은 오른쪽 칸의 것입니다. 아래는 GLSL 작성자가 특히 많이 찾는 이름들입니다.

GLSL ES 3.00TypeShade설명
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입니다.

GLSL ES 3.00TypeShade설명
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 작성자가 이미 쓰던 모양이 그것입니다.

컴파일러가 표기할 수 있는 내장 함수와 두 타깃에서 각각 생성하는 텍스트는 내장 함수 표에 있습니다.

이 페이지 편집 문제 보고