본문 바로가기

Library/Computer Graphics

Rendering Pipeline

그래픽스에서의 렌더링 파이프라인은 크게 응용 단계(application stage), 기하 단계(geometry stage), 래스터화 단계(rasterization stage)로 구성된다. 개략적으로, 응용 단계는 기하 단계에서 처리할 3D 기하 정보를 생성하는 단계이며, 기하 단계는 이 기하 정보들을 가상의 공간에서 선형 변환하는 단계이다. 래스터화 단계는, 이 가상 공간에서의 데이터를 실제로 눈에 보이는 2D 평면으로 투영(projection)하는 단계이다.

즉, 응용 단계에서 기하 정보를 생성한다는 것은 기하 정보 생성 그 외에도 충돌 검출, 애니메이션, 포스 피드백과 같은 요소들을 반영하여 다음 기하 단계에서 처리할 모든 정보를 생성하는 것을 뜻하는 것이다. 기하 단계는 아키텍처에 따라서 소프트웨어로 구현될 수도 있고, 하드웨어로 구현될 수도 있다. 이 단계에서는 무엇이 그려질지, 그것이 어떻게 그려질 것인지, 어디에 그려질 것인지를 계산한다.

응용 단계 : 이것은, 다음 기하 단계에서 처리할 기하 정보를 생성하는 것이 가장 큰 임무이다. 특히, 이 단계는 소프트웨어로 실행되므로, 여기서의 모든 것은 완전하게 통제가 가능하다. 다른 단계는 일부, 혹은 전체가 소프트웨어, 하드웨어로 구성되기 때문에, 구현 방법을 변경하는 것은 매우 어렵다. 다만, 이 단계를 처리하는 과정에서 생성되는 기하 정보를 통제하는 방법을 통해 나머지 과정에 영향을 미칠 수 있다. 소프트웨어 기반으로 구현된 응용 단계는 기하 단계나 래스터화 단계에서 하는 것처럼 부분 단계들로 분할할 수 없지만, 성능을 향상시키기 위해 병렬적으로 실행하는 것은 가능하다.

기하 단계 : 기하 단계는 다각형 단위의 조작이나 정점 단위의 조작을 주로 담당한다. 기하 단계는 다음 몇 개의 부분 단위로 분할 할 수 있는데, 주로 다음의 순서에 따른다.

1. 모델 변환 / 시각 변환(Model / View Transformation)
2. 조명 처리(Lighting)
3. 투영(Projection)
4. 클리핑(Clipping)
5. 화면 매핑(Mapping)

이 단계들은 어떻게 구성하느냐에 따라서 전체 파이프라인과 동일한 단계가 될 수도 있고, 그렇지 않을 수도 있다. 경우에 따라서 몇 개의 연속된 기능 단계들이 다른 파이프라인 단계와 연결되는 하나의 파이프라인을 구성할 수도 있고, 하나의 기능 단계가 여러 개의 작은 파이프라인 단계로 분할될 수도 있다.

래스터화 단계 : 기하 단계가 정점 단위의 조작을 하는 것과 달리, 래스터화 단계에서는 픽셀 단위의 조작을 한다.  즉, 변환되고 투영된 정점과 색상, 그리고 텍스처 정보가 주어졌을 때, 래스터화 단계에서는 이미지를 정확하게 그려내기 위해 각 픽셀에 정확한 색상을 지정한다. 이것이 래스터화 단계의 주목적이다. 이 과정을 래스터 변환, 또는 스캔 변환(scan conversion)이라 한다. 고성능 그래픽스를 위해 래스터 변환을 하드웨어로 구현하는 것은 매우 중요한 일이다.

가시성을 결정하는 것과 같은 문제는 래스터 변환 단계에서 일어난다. 가시성을 결정하기 위한 가장 대표적인 방법은 z-버퍼(z-buffer, 깊이 버퍼) 알고리즘이다. z-버퍼는 색상 정보와 동일한 깊이를 가지며, 하드웨어로 구현하기 매우 간단하기 때문에 널리 쓰인다. 즉, 하나의 기하 요소가 현재 픽셀로 렌더링될 때, 그 기하 요소가 해당 픽셀에서 가지는 z 값을 계산하여 동일 픽셀 상에 저장된 값과 비교하여 가시성 여부를 판단한다. 또, z-버퍼 알고리즘은 기하 순서에 상관없이 동일한 결과를 얻을 수 있기 때문에 더욱 유용하다.


다시 말하지만, 이들 과정 각각은 파이프라인화 될 수도 있고, 그 세부 과정 또한 몇 개의 파이프라인으로 다시 분할될 수 있다. 파이프라인을 n 단계로 구성했을때, 이론적으로는 n 배의 선형 증가를 보여야 하지만 실제로는 그렇지 않다. 이것은 파이프라인의 각 단계가 같은 작업량을 가지는 것도 아니고, 동일한 시간에 처리를 끝내는 것도 아니기 때문이다. 파이프라인의 최대 처리 속도는 각 단계에서 가장 느린 단계가 되며, 이 부분이 병목이 된다.


Reference
Tomas Akenine-Moller, Eric Haines, Real-Time Rendering 2nd edition, A K Peters, Ltd.