Rasterizer


Rasterizer는 vertex shader를 통해 얻은 정보들에 대해 사후처리를 하는 과정으로 크게 아래의 과정을 진행합니다.

  1. Clipping
  2. Perspective division
  3. Back-face Culling
  4. Viewport transform
  5. Scan conversion

Clipping


Clipping은 공간 상에서 view frustum안에 있는 정보를 제외하고는 버리는 과정으로 아래와 같이 영역에 걸리거나 밖에 있는 정보를 삭제합니다.



Perspective division

vertex shader에서 마지막에 projection transform을 진행한다고 하였는데 그러한 projection transform은 아래의 M_proj 행렬을 통해 이루어집니다.



camera space에 있던 좌표들에 위의 변환 행렬을 적용하게 되면 좌표들은 4차원이 되어 homogeneous clip space에 위치하게됩니다. 그래서 이를 4번째 항으로 나눠주어야 Cartesian space에 위치하게 되는데, 이 나눠주는 과정을 통해 원근법이 구현되기에 이름을 Perspective division이라고 합니다.

이는 아래의 수식과 같으며, 이러한 과정을 거치게 될 경우 물체의 좌표는 NDC(normalized device coordinate)이라고 하는 축의 값이 -1~1사이에 속하는 공간에 존재하게 됩니다.



Back-face culling

카메라의 반대편에 위치한 면은 어차피 보이지 않기에 계산할 필요가 없습니다. 그렇기에 각 면의 좌표값을 이용한 determinant값으 통해 앞쪽면인지 뒤쪽면인지 계산하여 해당 면을 계산에 포함하거나 제외하게 됩니다.



Viewport transform

Perspective division까지의 과정을 통해 관심 영역 안의 물체들을 전부 NDC 공간에 옮겨놓고 Back-face culling과 clipping을 통해 필요없는 부분들은 날렸놓은 상태입니다.

그러면 이제 실제로 송출할 화면에 우리의 물체들을 옮겨놓으면 될 것입니다. 이 화면을 viewport라고 부르는데 해상도에 따라 viewport의 가로 세로 길이가 달라질 것입니다.

그래서 NDC에 있는 물체들의 좌표에 아래의 행렬을 적용해 viewport로 이동시키게 됩니다.



Scan Conversion

마지막으로 Scan conversion으로 가장 중요한 과정입니다.

현재 계산된 정보는 전부 vertex에 관한 정보들입니다. 그런데 단순히 vertex뿐만 아니라 vertex안의 pixel들에 대한 정보가 있어야 화면을 그려낼 수 있을 것입니다.



현재 가지고 있는 vertex의 좌표와 normal vector정보를 이용하여 interpolation을 수행하여 각 pixel에 대한 정보를 얻어내면 rasterizer의 역할은 끝이 나게 됩니다.