Screen Transform
투영 변환이 끝난 후의 좌료계는 NDC(Normalized Device Coordinates)로 바뀌게 된다.
이 좌표계는 중심이 (0,0)이고 가장자리 까지 거리가 1인 공간이다.
우리가 보는 화면으로 나타내기 위해서는 이 좌표계에 있는 점들을 화면 좌표계(Screen Coordinates)로 변환하여야 한다.
이때 Viewport정보가 사용 된다.
화면 좌표계는 좌측 상단을 (0,0)으로 가지고 우측 하단을 (Width_screen, Height_screen)으로 가지게 된다.
NDC에서 화면 죄표계로 변환을 y 값 부터 생각해 본다.
NDC에서 y의 범위는 [-1, 1]이므로 화면 좌표계의[0, Height_screen]으로 바꾸어야 한다.
1. y범위가 2배 단위 이므로 절반으로 나누어 1배 단위로 만들고 Height_screen값을 곱하여 늘려준다.
2. NDC의 y 방향과 화면 좌표계의 방향은 반대 이므로 Flip 하여 준다.
3. 화면 좌표계는 좌측 상단(0,0)부터 시작 하므로 Height_screen의 높이의 절반을 더하여 상단으로 이동시켜 준다.
4. x값의 경우, NDC에서의 x 좌표 방향과 화면 좌표계의 x 방향이 같으므로 Flip 과정이 필요 없다.
그러므로 2번 과정을 제외한 1, 3번 과정을 동일하게 적용하여 값을 구한다.
지금까지 구해진 x_s, y_s 는 화면 좌표계에서 화면의 좌측 상단이 (0, 0)일때를 고려 하였다.
하지만 경우에 따라 좌측 상단이 이 다른 값을 가질 수도 있다.
특정 좌측 상단값을 (x_c, y_c)이라고 할 경우
지금 까지 구해진 x_s, y_s값에 추가로 더하여 주기만 하면 된다.
마지막으로 z값은 깊이 테스트에 사용하기 위해서
NDC의 범위 [-1, 1]에서 [0, depth_screen]으로 변환해 주어야 한다.
depth_screen값은 보통 1을 사용한다.
x_s 값을 구하는 과정과 똑같이 1, 3번 과정을 거치면 최종 z_s 값은 다음과 같아 진다.
NDC에서 화면 좌표계로의 변환을 행렬로 나타낼 수 있다.
DirectX 경우 NDC의 z 범위는 [0, 1]을 사용하고 있다.
따라서 z값을 절반으로 나눌 필요 없이 바로 depth_screen 값을 곱하여 늘려 주며
3번 과정 처럼 추가적으로 z값을 이동 시켜 줄 필요도 없다.
결과적으로 z값은 다음과 같다.
그래서 DirectX에서 사용되는 행렬은 아래와 같이 된다.
참고자료
Essential Mathematics for Games & Interactive Applications Second Edition