# 화면 좌표계로의 변환

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

#### 변환 과정

**클립 공간에서 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. **뷰포트 설정**:
   * $\text{width}\_\text{viewport} = 800$
   * $\text{height}\_\text{viewport} = 600$
   * $x\_\text{viewport\_min} = 0$
   * $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}
$$

2. **뷰포트 좌표로 변환**:

$$
\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}
$$

3. **화면 좌표계로 변환**:

$$
\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)$로 변환된다.

***

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