Rasterization의 두 번째이자 마지막 단계: Triangle Traversal
이번에는 Rasterization의 두 번째이자 마지막 단계인 Triangle Traversal에 대해 알아보자.
이 단계는 Triangle Setup 단계에서 준비한 정보를 바탕으로 픽셀에 프래그먼트를 생성하는 역할을 한다.
Triangle Traversal이 하는 일
Triangle Traversal 단계에서는 프리미티브(삼각형)를 순회하며 다음 작업을 반복한다:
1. 프리미티브에 속하는 픽셀 찾기
- 픽셀 범위 순회
- Triangle Setup 단계에서 정한 픽셀 범위 내에서 픽셀을 순회하며, 해당 픽셀이 삼각형에 포함되는지 판단한다.
- 삼각형 포함 여부는 보통 바리센트릭 좌표를 사용하여 확인한다.
- 바리센트릭 좌표를 이용한 포함 여부 판단
- 삼각형의 정점에 대한 바리센트릭 좌표 λ1, λ2, λ3가 모두 [0.0 ~ 1.0] 범위 내에 있으면 해당 픽셀은 삼각형에 포함된다.
- 안티앨리어싱 적용 시 처리
- 일반적으로는 픽셀의 중심점(샘플 1개)만 검사하지만, 안티앨리어싱이 적용된 경우 픽셀 내에 여러 샘플을 검사한다.
- 샘플 단위로 삼각형 포함 여부를 판단한 뒤, 생성된 샘플 데이터를 멀티 샘플 버퍼(Multi-Sample Buffer)에 저장한다.
안티앨리어싱이란?
안티앨리어싱은 삼각형 경계의 계단 현상(Aliasing)을 줄이기 위해 픽셀 내부를 여러 샘플로 나눠 처리하는 방법이다.
- 방법
- 픽셀 내부에 여러 샘플을 배치하고, 각 샘플에 대해 삼각형 포함 여부를 판단한다.
- 샘플의 결과를 평균 내어 부드러운 렌더링을 만든다.
- 특징
- 안티앨리어싱 방법에는 MSAA(Multi-Sampling Anti-Aliasing), SSAA(Super-Sampling Anti-Aliasing) 등이 있다.
- MSAA는 삼각형 경계에서만 추가 샘플링을 진행하는 방식으로 효율적이다.
- 샘플 처리
- 샘플별 계산은 Pixel Processing의 Fragment Shader 단계부터 진행될 수도 있고, Merging 단계에서 계산될 수도 있다.
2. 프레그먼트 생성
- 프레그먼트란?
- 프레그먼트는 픽셀 단위의 데이터 묶음으로, 다음과 같은 정보를 포함한다:
- 텍스처 좌표(Texcoords)
- 법선 벡터(Normal)
- 깊이 값(z 값)
- 이 정보들은 다음 단계인 Pixel Processing 단계에서 최종 색상 계산에 사용된다.
- 프레그먼트 생성 과정
- 삼각형 포함 여부를 통과한 샘플은 프레그먼트로 변환된다.
- 생성된 프레그먼트의 속성 값은 Triangle Setup 단계에서 준비한 데이터를 기반으로 보간(Interpolation)된다.
- Face Culling 적용
- Face Culling이 활성화된 경우, Cull 조건(Front-Facing/Back-Facing)을 만족하지 않는 프리미티브에서는 프레그먼트를 생성하지 않는다.
Triangle Traversal의 역할
- Triangle Traversal 단계는 Geometry Processing 단계에서 넘겨받은 정점 정보를 토대로, 각 프리미티브를 순회하며 픽셀별 프레그먼트 데이터를 생성하는 역할을 한다.
- 이 과정에서 포함 여부 판단, 보간, 안티앨리어싱 처리가 이루어진다.
프로그래머의 제어 범위
- 이 단계는 보통 프로그래머가 직접 제어하기보다는 Face Culling, 안티앨리어싱 옵션 등 간접적인 설정으로 제어한다.
- GPU가 최적화된 하드웨어를 통해 이 과정을 효율적으로 처리하므로, 프로그래머는 고수준의 옵션만 제공하면 된다.
다음 단계: Pixel Processing
Triangle Traversal 단계가 끝나면, 생성된 프레그먼트 데이터는 다음 단계인 Pixel Processing으로 넘어간다.
Pixel Processing 단계에서는 각 프레그먼트의 정보를 기반으로 최종 색상을 계산하며, 화면에 렌더링될 데이터를 결정한다.
결론
Triangle Traversal은 Rasterization의 마지막 단계로, 삼각형을 순회하며 픽셀별 데이터를 처리하는 핵심 역할을 한다.
이 단계는 프리미티브 포함 여부 판단, 프레그먼트 생성, 안티앨리어싱 적용 등의 작업을 수행하며, 최종적으로 픽셀 단위 데이터를 생성하여 렌더링의 기반을 만든다.
이제 Pixel Processing 단계에서 이 데이터를 활용해 최종 색상을 결정하게 된다.