동차 좌표계에서 화면 좌표계로 변환하는 과정은 그래픽스를 화면에 렌더링하기 위해 필수적이다. 동차 좌표계는 클립 공간 및 뷰포트 좌표계와의 변환을 매끄럽게 처리하기 위해 사용된다. 이 과정에서 주로 사용하는 변환은 뷰포트 변환이다.

변환 과정

클립 공간에서 NDC로

동차 좌표계를 클립 공간으로 변환한 후, 이를 정규 장치 좌표계(NDC, Normalized Device Coordinates)로 변환한다. 클립 공간에서 정규 장치 좌표계로의 변환은 다음과 같이 이루어진다:

\begin{aligned} x_\text{ndc} &= \frac{x_\text{clip}}{w_\text{clip}} \\ y_\text{ndc} &= \frac{y_\text{clip}}{w_\text{clip}} \\ z_\text{ndc} &= \frac{z_\text{clip}}{w_\text{clip}} \end{aligned}

여기서 w_\text{clip}은 동차 좌표계의 W 성분으로, 이 변환을 통해 4차원 동차 좌표계를 3차원 좌표계로 재구성한다.

NDC에서 뷰포트로

정규 장치 좌표계에서 뷰포트 좌표계로 변환하는 것은 다음 단계를 포함한다. 뷰포트 좌표계는 화면의 특정 영역을 정의하며, 일반적으로 픽셀 단위로 표현된다.

뷰포트 좌표계로 변환하기 위해 다음의 선형 변환을 사용한다:

\begin{aligned} x_\text{viewport} &= \left(\frac{x_\text{ndc} + 1}{2}\right) \cdot \text{width}_\text{viewport} + x_\text{viewport\_min} \\ y_\text{viewport} &= \left(\frac{y_\text{ndc} + 1}{2}\right) \cdot \text{height}_\text{viewport} + y_\text{viewport\_min} \\ z_\text{viewport} &= \left(\frac{z_\text{ndc} + 1}{2}\right) \end{aligned}

여기서 \text{width}_\text{viewport}\text{height}_\text{viewport}는 뷰포트의 너비와 높이이며, x_\text{viewport\_min}y_\text{viewport\_min}은 뷰포트의 최소 좌표이다.

실제 좌표로 변환

변환된 뷰포트 좌표계를 실제 화면 좌표계로 변환하면 최종적으로 픽셀 단위의 좌표를 얻을 수 있다. 이 변환은 다음과 같은 단계를 포함한다:

  1. NDC 좌표를 [0, width]와 [0, height] 범위로 스케일링한다.
  2. 화면의 좌표계에 맞추어 이동한다.

최종 변환 공식을 정리하면 다음과 같다:

\begin{aligned} x_\text{screen} &= x_\text{viewport} \\ y_\text{screen} &= y_\text{viewport} \\ z_\text{screen} &= z_\text{viewport} \end{aligned}

예제

이론적인 설명을 보다 명확히 하기 위해, 간단한 예제를 통해 화면 좌표계로의 변환 과정을 살펴보겠다.

예제 설정

  1. 클립 공간 좌표: (x_\text{clip}, y_\text{clip}, z_\text{clip}, w_\text{clip}) = (0.5, 0.5, 0.5, 1.0)
  2. 뷰포트 설정:
  3. \text{width}_\text{viewport} = 800
  4. \text{height}_\text{viewport} = 600
  5. x_\text{viewport\_min} = 0
  6. y_\text{viewport\_min} = 0

계산 과정

  1. NDC로 변환:
\begin{aligned} x_\text{ndc} &= \frac{0.5}{1.0} = 0.5 \\ y_\text{ndc} &= \frac{0.5}{1.0} = 0.5 \\ z_\text{ndc} &= \frac{0.5}{1.0} = 0.5 \end{aligned}
  1. 뷰포트 좌표로 변환:
\begin{aligned} x_\text{viewport} &= \left(\frac{0.5 + 1}{2}\right) \cdot 800 + 0 = 0.75 \cdot 800 = 600 \\ y_\text{viewport} &= \left(\frac{0.5 + 1}{2}\right) \cdot 600 + 0 = 0.75 \cdot 600 = 450 \\ z_\text{viewport} &= \left(\frac{0.5 + 1}{2}\right) = 0.75 \end{aligned}
  1. 화면 좌표계로 변환:
\begin{aligned} x_\text{screen} &= 600 \\ y_\text{screen} &= 450 \\ z_\text{screen} &= 0.75 \end{aligned}

따라서 클립 공간에서 시작한 점 (0.5, 0.5, 0.5, 1.0)은 결국 화면 좌표계에서 (600, 450, 0.75)로 변환된다.


동차 좌표계에서 화면 좌표계로의 변환은 그래픽스 파이프라인의 중요한 부분이다. 이 변환 과정은 다양한 공간 변환과 좌표계를 포함하며, 최종적으로 그래픽 요소를 화면에 정확하게 렌더링하는 데 필수적이다. 이해를 돕기 위한 예제를 통해 이러한 변환의 실제 적용 방법을 보여드렸다.