Clip Space의 vertex데이터(position, color, uv 등)를Viewport로 변환하고, 정점 데이터를 기반으로 보간된 프래그먼트(픽셀 데이터)를 생성한다 쉽게 말해서 삼각형 내부를 pixel로 채우는 것! 이 단계 이후로 픽셀 각각에 대해 접근가능해짐
Vertex Shader을 거쳐, vertex들의 final position (clip space position)을 구해서 이제 Rasterizer로 넘어감.
Rasterizer는 있어도 되고 없어도 되는데, 어쨌든 미리 만들어진 fixed 형태로 작동한다.
Rasterizer 스테이지의 주 역할은, Vertex들을 기준으로, primitive 내부의 Pixel을 채워주는 것이다.
그전에, 아래와 같은 몇가지 처리들을 한다.
Primitive Clipping
Perspective Division
Viewport Transform
Back-face Culling
Q. Face culling 같은건additional(부가적인)한 연산이잖아.왜 굳이 만들었다 지움? 그냥 하는게 더 빠르지 않음? A. Pixel 데이터로 바뀌는 순간 연산 오버헤드가 막 늘어남. vertex 기준이던게 pixel로 증식해서, 얘네 칼라값다 정해서 채워야 하니까. 따라서 Pixel shader로 넘어가기 전에 불필요한 애들을 쳐 놓으면 나중에 효율이 엄청 올라가게 되는 것.
◆ Rasterizer Stage - Primitive Clipping
clipping volume 밖으로 나가는 primitive들을 잘라내고 처리(새 primitve 만들기)하는 것
primitive clipping은 clip space에서 진행하지만, 직관적인 이해를 돕기 위해 camera space인 것처럼 설명하겟음.
▷ t1은 완전히 frustum 외부에 있으므로, CPU에서 미리 frustum culling됨
▷ t2는 완전히 frustum 내부에 있으므로, 그대로 냅둠
▷ t3는 frustum 경계에 걸쳐 있다! => clipping 됨
DirectX clipping volume
이전에 projection transform을 통해서 2x2x1 size의 clipping volume(Clip space)으로 이동되었다.
이제 clipping volume 경계에 걸친 primitive들을 clipping 해주면 됨.
primitive가 어떻게 clip되는지는primitive type에 따라 다름.
Point : 포인트가 1 픽셀보다 큰 경우, 이 포인트의 중심이 clipping volume 밖에 있으면 없애고 안에 있으면 살려.
Line : 선이 부분적으로 clipping volume 밖으로 나가면, 나가는 경계를 자르고 그 지점에 새 vertex 추가해.
Triangle : triangle이 부분적으로 clipping volume 밖으로 나가면 자르고, 잘린 곳에다 다시 vertex 생성해서 새로 triangle 만들어.
◆ Rasterizer Stage - Perspective Division
3D space를 2D 화면으로 변환하기 위한 원근법을 구현 Clip space -> NDC space
현재 우리가 알고 있는 것은 clipping volume이라는 3차원 공간(Clip space)이다. 그러나 최종적으로 필요한 것은 모니터 화면에 출력될 2차원 영역임! 따라서 3차원 공간을 2차원 공간으로 변환시켜줘야 할 것임. 이 과정에서 우선 원근법을 적용시켜 줘야 함~ (저번에 M_proj 곱해서 처리했던 원근법은 3차원상 원근법이었음.)
M_proj는 마지막 열이 (0, 0, 1, 0)이라서, (x, y, z, 1) 벡터와 곱하면 w축 좌표가 z가 된다.
Vertex Shader은 Rasterizer에게 이런 형태의 좌표들을 넘겨줬을 것임!
따라서 Vertex Shader에게 받은 Vertex들의 Clip space 좌표에서
w에 저장된 값(원래 z값)으로 모든 좌표를 나눠주면 원근법 구현이 완료됨.
Z로 나누어 준다는 것은, 멀리 있는 물체는 더 큰 값으로 나눠주고, 가까이 있는 물체는 더 작은 값으로 나눠준다는 것.
그리고 최종적으로 z값을 0~1사이로 한정할 수 있을 것이다.
이처럼 가까이/멀리를 구분해서 가까이 있는 물체를 더 크게, 멀리 있는 물체를 더 작게 보이도록 만든 것임.