점 $\vec{p}$ 가 NDC 공간의 평면 안쪽에 있는지 여부를 돌려줍니다. 인자로 준 p
는 반드시 클립 좌표(clip coordinate)이어야 합니다. 해당 함수들은 Renderer.clipTriangle0() 의 구현에 사용됩니다.
testRight(p);
testLeft(p);
testTop(p);
testBottom(p);
testFar(p);
testNear(p);
p
NDC 공간의 평면 안에 있는지 확인할 점을 나타내는 Vector2
. 반드시 클립 좌표(clip coordinate)이어야 합니다.
클립 좌표(clip coordinate)인 점 $\vec{p}$ 가 NDC 공간 안에 위치한지 여부를 나타내는 number
. 예를 들어 p
가 NDC 공간 안에 있다면 1
. 바깥에 있다면 0
을 돌려줍니다
Camera.perspective() 를 통해 원근투영을 적용하게 되면, 절두체(Frustum) 안에 들어있는 모든 점들의 $x, y, z$ 성분들은 $[-1, 1]$ 범위의 값을 가지게 됩니다. 그렇다면 삼각형의 일부만 절두체(frustum) 내부에 있는 경우는 어떻게 처리해야 할까요?
카메라의 영역을 벗어나는 것도 문제지만, $near$ 평면을 벗어난 점이 있다면 삼각형의 상하가 뒤집히게 되겠죠 (물론 그것보다도 삼각형이 기하급수적으로 커져서 RendererJS 가 프리징(freezing)에 걸릴겁니다). 이런 상황들을 방지하기 위해, 삼각형을 잘라내서 절두체(frustum) 안에 들어있는 부분만 그려내야됩니다.
testRight(), testLeft(), testTop(), testBottom(), testFar(), testNear()
함수들은 여기서 인자로 받은 점 $\vec{p}$ 가 NDC 공간 안에 위치한지를 검사하는 역할을 담당합니다. NDC 공간은 여기서 절두체(frustum)를 정사각형으로 정규화한 공간을 의미합니다. Normalized Device Coordinate 의 약자로, 이름 그대로 정규화되었기 때문에 $[-1, 1]$ 범위의 값을 가집니다:
정규화된 절두체(frustum) 공간을 나타내는 NDC 공간.
그렇다면 여기서 testNear()
의 구현을 생각해봅시다. NDC 공간의 점을 나타내는 $\vec{p_{ndc}} = (x_{ndc}, \text{ }y_{ndc}, \text{ }z_{ndc})$ 가 있다고 해보죠. $Near$ 평면은 $z = -1$ 인 평면을 의미합니다. 그렇다면 $Near$ 평면의 안쪽에 있다면 $z_{ndc} ≤ -1$ 이어야 하겠네요. 반대로 $Far$ 평면은 $z = 1$ 인 평면을 의미하며, $Far$ 평면의 안쪽에 있다면 $z_{ndc} ≤ 1$ 이어야 합니다.
즉 하나의 평면이 아니라, $\vec{p_{ndc}}$ 가 NDC 공간 내부에 있다면, 다음 조건을 만족해야 한다는 의미입니다:
$$ -1 \le x_{ndc} < 1 \\ -1 \le y_{ndc} < 1 \\ -1 \le z_{ndc} < 1 \\ $$