1. 개요
래스터라이저 스테이지(RS)는 그래픽스 파이프라인에서 정점 처리(VS/DS/GS)와 픽셀 처리(PS) 사이를 잇는 필수적인 고정 기능(Fixed-Function) 스테이지이다. 즉, 개발자가 셰이더 코드로 프로그래밍할 수 없으며, GPU 하드웨어가 정해진 규칙에 따라 동작한다.
RS의 목적은 3D 공간의 벡터(Vector) 데이터인 기본 도형(Primitive)(예: 삼각형)을 입력받아, 2D 화면을 구성하는 픽셀(Pixel)의 집합인 프래그먼트(Fragment)로 변환하는 것이다.
이 변환 과정에서 RS는 여러 하위 작업을 순차적으로 수행한다.
2. 클리핑 (Primitive Clipping)

- 목적: 뷰 프러스텀(View Frustum) 밖에 존재하는 지오메트리를 잘라내는(Clip) 작업이다.
- 작동:
- VS/DS에서 출력된 정점의 클립 공간(Clip Space) 좌표(SV_Position)를 사용한다. (이 좌표는 동차 좌표계 (x, y, z, w)로 표현된다.)
- 클립 공간은 표준화된 정육면체(DirectX 기준: : -w <= x, y, <= w, 0 <= z <= w 로 정의된다.
- RS는 이 범위를 벗어나는 삼각형의 일부 또는 전체를 제거(Cull)하거나 잘라낸다.
- 만약 삼각형이 클립 경계에 걸쳐 있다면, RS는 경계면을 기준으로 삼각형을 잘라 새로운 정점을 생성하여 뷰 프러스텀 내부에 정확히 맞춰진 새 삼각형(들)을 만들어낸다.
3. 원근 나누기 (Perspective Divide)

- 목적: 원근(Perspective)을 적용하고, 좌표계를 NDC(Normalized Device Coordinates)로 변환한다.
- 작동:
- 클리핑이 완료된 각 정점의 클립 공간 좌표 (x, y, z, w)를 네 번째 성분인 w로 나눈다.
정확히는, Projection Transform Matrix의 마지막 Column은 (0, 0, 1, 0)이다. 따라서 (x, y, z, 1) (0, 0, 1, 0) 시 w 성분에 z 값이 저장된다. (여기서 양의 z값은 Camera space의 xy 평면으로 부터의 거리)
따라서 Clip Space에서 데카르트 좌표계로 전환하기 위해, w(즉 z값)으로 나눈다. - 이 w로 나누는 연산 자체가 3D의 원근(멀리 있는 것은 작게 보임)을 2D 화면에 투영하게 된다. (Perspective Division)
- 결과:(x/w, y/w, z/w)
- 이 결과 좌표가 바로 NDC이며, 이 좌표계는 DirectX 기준 다음 범위를 가진다.
- X: -1(왼쪽) ~ +1 (오른쪽)
- Y: -1 (아래쪽) ~ +1 (위쪽)
- Z: 0 (카메라 앞) ~ +1 (가장 먼 곳)
- 클리핑이 완료된 각 정점의 클립 공간 좌표 (x, y, z, w)를 네 번째 성분인 w로 나눈다.
4. 뷰포트 변환 (Viewport Transform)


- 목적: NDC(-1 ~ +1 범위)라는 논리적인 좌표를, 실제 렌더링 대상(화면, 텍스처)의 픽셀 좌표(Screen Coordinates)로 변환한다. 즉 정점들의 위치를 NDC Space에서 Window (Screen) Space로 변환 하는 것.
- 작동:
- 개발자가 설정한 뷰포트(Viewport) 정보(보통 D3D12_VIEWPORT 구조체)를 참조한다. 이 정보에는 "화면의 (X, Y) 위치에서 (너비, 높이) 크기만큼" 렌더링하라는 정보가 담겨있다.
- NDC의 X, Y 좌표를 이 뷰포트의 픽셀 범위(예를들어 1920 * 1080의 경우 0 <= x <= 1920, 0 <= y <=1080)로 스케일링하고 변환한다.
- Z 좌표(깊이 값) 역시 뷰포트에 설정된 깊이 범위(예: 0.0 <= z <= .0)로 변환된다.
- 이 단계가 끝나면 각 정점은 화면의 몇 번째 픽셀에 위치하는지 알게 된다.
5. 후면 컬링 (Back-face Culling)

- 목적: 카메라를 등지고 있는 삼각형(뒷면)을 렌더링 과정에서 제거(Cull)하여 성능을 향상시킨다.
- 작동:
- 뷰포트 변환까지 마친 2D 픽셀 좌표를 기준으로, 삼각형을 구성하는 3개 정점의 순서(Winding Order)를 검사한다.
- 이 순서가 시계 방향(Clockwise, CW)인지 반시계 방향(Counter-Clockwise, CCW)인지를 판별한다.
- 일반적으로는 반시계 방향'을 앞면(Front-face)으로 정의. 또한 기본값으로 face culling은 활성화 되어있음.
- RS는 렌더링 설정(D3D12_RASTERIZER_DESC의 CullMode)을 확인한다.
- D3D12_CULL_MODE_BACK: 시계 방향(뒷면)인 삼각형을 제거한다. (가장 보편적)
- D3D12_CULL_MODE_FRONT: 반시계 방향(앞면)인 삼각형을 제거한다.
- D3D12_CULL_MODE_NONE: 아무것도 제거하지 않는다. (양면 렌더링 시 사용)
- Rasteriztion과 Fragment Shader 연산 전 뒷면(back face)의 primitive를 제거하여 성능을 향상시킨다.
- 다만 항상 Back face가 제거되는 것은 아니다. 비어있는 반투명 구를 렌더링 한다면? front face를 통해 back face가 보이도록 해야하기 때문.

6. 래스터화 (Rasterization / Scan Conversion)

- 목적: (클리핑, 컬링 등에서 제거되지 않은) 2D 삼각형이 화면의 어떤 픽셀 중심을 덮고(Cover) 있는지 판별한다.
- 작동:
- RS는 삼각형의 2D 경계선을 스캔(Scan)한다.
- 삼각형 내부에 중심이 포함되는 모든 픽셀을 식별한다.
- 이렇게 식별된 "픽셀이 될 후보" 하나하나를 프래그먼트(Fragment)라고 부른다.
- RS는 이 프래그먼트들을 생성하여 픽셀 셰이더(PS)로 보낼 준비를 한다.
6.1 Rasterization rule (Top-left Rule)

만약 두 삼각형이 공유하는 모서리 위에 pixel이 있다면, 어떤 삼각형에 속하는지 정해야 한다. (그렇지 않으면 연산이 두번 발생한다.) 직관적으로, 삼각형은 왼쪽, 오른쪽, 위 또는 아래 모서리를 가질 수 있다.
- 아래 그림에서, t1은 두 개의 왼쪽 모서리와 하나의 오른쪽 모서리를 가지고 있고, t2는 하나의 왼쪽 모서리, 하나의 오른쪽 모서리, 하나의 아래 모서리를 가지고 있으며, t3는 하나의 왼쪽 모서리, 하나의 오른쪽 모서리, 하나의 위 모서리를 가지고 있다.
- Direct3D는 상-좌 규칙(top-left rule)을 채택하여, 이 규칙에 의해 픽셀이 삼각형의 상단 또는 왼쪽 모서리에 위치하면 해당 픽셀이 삼각형에 속한다고 명시한다.
6.2 Edge Equation
Edge equation 주어진 점이 선분을 기준으로 어느쪽에 있는지 확인한다.
삼각형의 세 모서리를 기준으로 Edge quation을 적용했을 때, 점이 모두 모서리 오른쪽에 있으면 내부의 점이다.
세 모서리를 기준으로 Edge Equation을 적용했을 때, 결과가 모두 양수 또는 0인 경우 픽셀은 내부, 단 하나라도 음수인 경우 픽셀은 외부의 점이다.


7. 특성 보간 (Attribute Interpolation)


- 목적: 픽셀 셰이더(PS)가 각 프래그먼트(픽셀)를 셰이딩하는 데 필요한 데이터를 계산한다.
- 작동:
- VS/DS는 정점(Vertex) 단위의 데이터(예: UV 좌표, Normal 벡터, Color 값)만 출력했다.
- 래스터화 과정에서 생성된 삼각형 내부의 각 프래그먼트는 이 데이터가 필요하다.
- RS는 삼각형 꼭짓점 3개의 특성 값을 사용하여, 각 프래그먼트의 위치에 해당하는 중간 값을 계산(보간)한다.
- 원근 보정 보간 (Perspective-Correct Interpolation):
- 텍스처 좌표 UV 값은 원근 때문에 비선형적으로(non-linearly) 변한다.
- RS는 'Perspective Division' 단계에서 사용한 w값(1/w)을 이용하여, 원근 왜곡이 정확하게 보정된 값으로 특성을 보간한다. 이를 통해 텍스처가 멀리 있어도 찌그러지지 않고 올바르게 표시된다.
- attribute = (attribute/w) / (1/w)
- 보간된 UV = (u₀/w₀ · α + u₁/w₁ · β + u₂/w₂ · γ) / (1/w₀ · α + 1/w₁ · β + 1/w₂ · γ)
- 여기서 α, β, γ는 무게중심 좌표입니다.
8. 래스터라이저 상태 (Rasterizer State) 적용
- 위에서 언급된 많은 기능(컬링, 뷰포트 등)과 추가적인 렌더링 방식들은 모두 개발자가 설정한 래스터라이저 상태(State) 객체(예: D3D12_RASTERIZER_DESC)에 의해 제어된다.
- 주요 설정:
- FillMode: 면을 채울지(SOLID), 선으로만 그릴지(WIREFRAME).
- CullMode: BACK, FRONT, NONE.
- FrontCounterClockwise: CCW를 앞면으로 볼지 (기본값) CW를 앞면으로 볼지.
- MultisampleEnable: MSAA(Multi-Sample Anti-Aliasing)를 켤지 여부.
3. 요약
래스터라이저 스테이지(RS)는 3D 지오메트리 데이터를 클리핑, 컬링으로 불필요한 작업을 제거하고, 래스터화와 보간을 통해 픽셀 셰이더가 작업할 프래그먼트로 변환시킨다.
'그래픽스' 카테고리의 다른 글
| 08. Pixel Shader - Normal Mapping (0) | 2025.11.04 |
|---|---|
| 08. Pixel Shader - Image Texturing (0) | 2025.11.04 |
| 06. Geometry Shader (0) | 2025.11.04 |
| 05. Domain Shader (0) | 2025.11.04 |
| 04. Tessellator (0) | 2025.11.04 |