2013년 3월 2일 토요일

Screen Transform (화면 변환)


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