[ Graphics ] 레스터라이저
레스터라이저
정점 쉐이더에서 출력한 정점들은 프리미티브로 조립된다. 이를 래스터화(rasterization)라고 한다. 그리고 이 과정에서 클리핑(clipping), 원근 나눗셈(perspective division), 뒷면 제거(back-face culling), 뷰포트 변환(viewport transform), 스캔 전환(scan conversion) 등이 일어난다.
1. 래스터라이저
1) 클리핑
뷰 프러스트럼 바깥의 물체를 제거하는 것으로 , 물체의 일부가 뷰 프러스트럼 바깥에 존재 시, 해당 위치에 새로운 정점을 추가하여 새로운 프리미티브를 만든다.
-> GPU에서 자동 처리되는 기능
2) 원근 나눗셈
projection transform 과정에서 뷰프러스트럼을 투영변환 (projection transform) 시, 피라미드 모양의 절두체를 2X2X2 정육면체로 변환하는 과정에서 동차좌표 w 값이 1이 아니게 된다. 동차 좌표를 카테시안 좌표로 전환하려면 w 값이 1이어야 하므로 동차 좌표의 모든 원소를 w로 나눈다. 이러한 과정을 거쳐 얻은 카테시안 좌표를 NDC(Normalized Device Coordinate; 정규화된 좌표계)라고 한다.
-> GPU에서 자동 처리되는 기능
3) 뒷면 제거
폴리곤이 카메라를 바라보는 위치에 존재 시 이를 출력해야 하나, 바라보지 않는 경우에는 이를 출력하지 않아도 문제가 발생하지 않는다. 이를 구분하기 위해 삼각형의 정점과 카메라를 벡터로 연결하여 확인한다.
삼각형의 정점과 카메라 간 연결 벡터를 통한 내적을 사용, 구분한다.
- 내적 값 == 0 : 변만 보이는 삼각형(edge-on face)
- 내적 값 < 0 : 뒷면 (back face)
- 내적 값 > 0 : 앞면 (front face)
4) 뷰포트 변환
NDC 작업이 완료된 뷰 프러스트럼은 스크린 영역(screen space)으로 이동하여 출력 되는데, 이를 뷰포트(Viewport)라고 하며 공간 고유의 좌표계를 가진다.
NDC 작업이 완료된 뷰 프러스트럼을 스크린 영역의 좌표계에 맞춰 같은 크기로 변환한다.
5) 스캔 전환
뷰포트 변환이 끝난 삼각형들은 스캔전환(scan conversion)을 통해 삼각형 내부를 채우는 프래그먼트를 생성한다. 각 삼각형의 정점이 완전히 픽셀의 정점과 일치할 수 없기 때문에 삼각형의 정점별 애트리뷰트를 보간하여 픽셀 위치에 할당, 삼각형 내부를 채운다.
정점별 애트리뷰트는 먼저, 삼각형의 변을 따라 선형보간(linear interpolation)되고 스캔라인을 따라 수행된다. 이를 겹선형 보간(bilinear interpolation)이라고 한다.
변환한 정점이 스크린을 이루는 픽셀 중 가까운 정도에 따라 그려지는 픽셀 위치를 정한다.
출처: OpenGL ES를 이용한 3차원 컴퓨터 그래픽스 입문