클리핑, 원근 나눗셈, 뒷면 제거, 뷰포트 변환, 스캔 변환 등의 요소로 구성된다.
클리핑이나 원근 나눗셈은 알고리즘을 정확히 이해하지 않아도 큰 지장은 없지만 그 외 요소들은 작동 원리에 대한 이해가 있어야 적절한 제어를 할 수 있기 때문에 이해가 필요하다.
특히나 스캔 변환은 잘 이해해야만 프래그먼트 처리를 위한 프로그램을 작성할 수 있다.
◾ 클리핑
투영 행렬이 적용된 2x2x1 크기의 클립 공간 바깥에 있는 정점들을 잘라내는 과정이다.
◾ 원근 나눗셈
각 정점을 자신의 w값으로 나누어서 데카르트 좌표계로 변환시킨다. 보통 NDC(normalized device coordinates)라고 부른다.
w는 카메라 공간의 xy평면으로부터 해당 정점까지의 수직 거리이므로 카메라로부터 멀리 떨어진 물체는 w값이 크기 때문에 w로 나누면 크기가 작아진다.
◾ 뒷면 제거 (back-face culling)
삼각형의 노말 벡터와 삼각형 정점과 카메라 사이의 정규 벡터를 내적해서 0은 변만 보이는 삼각형, 음수는 앞면, 양수는 뒷면으로 판단할 수 있다.
하지만 컬링은 카메라 공간에서 수행하는 것이 비효율적이기 때문에 투영변환 이후 수행을 하게 된다.
직교투영 이후에는 사실상 z축이 소실되기 때문에 카메라 공간에서처럼 내적으로 판별하지 않고 정점들의 정렬 순서로 판단하게 된다.
만약 모든 삼각형의 정점이 시계 방향으로 정렬되어 있다면 반시계 방향은 뒷면으로 판단할 수 있는 것이다.
뒷면으로 판단되었다고 해서 무조건 컬링을 해야하는 것은 아니고 선택적으로 수행할 수 있도록 API에서 지원해준다.
차후 다룰 내용이지만 앞면으로 판단되었다고 해서 반드시 최종 렌더링 결과물에 나오는 것은 아니다. 다른 물체들에 의해 가려질 수 있기 때문에 깊이 버퍼라는 알고리즘에 의해 한 번 더 처리가 된다.
◾ 뷰포트 변환
스크린 상의 윈도우는 y축이 음의 방향인 스크린 공간을 가진다. z축은 화면 안쪽으로 들어가게 된다. (오른손 좌표계)
뷰포트의 종횡비는 절두체의 종횡비와 동일하게 설정된다.
NDC로 표현된 2x2x1 크기의 뷰 볼륨은 뷰포트 변환에 의해 뷰포트로 매핑이 되고, z값은 추후 깊이 버퍼 등에 사용된다.
클립 공간은 왼손 좌표계이고 스크린 공간은 오른손 좌표계이기 때문에 xz평면을 기준으로 반사시키고 축소확대, 이동 변환을 적용시키면 뷰포트로의 변환은 끝난다.
대부분의 게임에서는 전체화면을 사용하기 때문에 뷰포트가 윈도우 전체 영역을 사용하므로 MinX, MinY는 0이 되고 보통 MinZ, MaxZ는 0, 1로 설정되기 때문에 행렬이 단순화 될 수 있다.
뷰포트 변환은 최종적으로 모든 삼각형을 스크린 공간으로 옮기게 된다.
◾ 스캔 변환
래스터라이저의 마지막 단계이다. 삼각형의 내부를 채우는 프래그먼트들을 생성하는 단계이다.
좀 더 정확하게 말하자면 개별 삼각형이 차지하는 스크린 공간의 픽셀 위치를 결정하고 삼각형의 정점별 속성을 보간하여 이를 각 픽셀 위치에 할당하는 작업이다.
'이론 > 그래픽스' 카테고리의 다른 글
[Chapter 5] 조명 및 쉐이더 (0) | 2023.05.17 |
---|---|
[Chapter 4] 프래그먼트 처리와 출력 병합 (0) | 2023.05.11 |
[Chapter 2] 정점 처리 (0) | 2023.04.27 |
[Chapter 1] 폴리곤 메쉬 (0) | 2022.09.16 |