래스터라이저에 의해 생성된 프래그먼트들은 다양한 속성들을 포함할 수 있고 이 속성들을 이용해서 각 프래그먼트의 최종 색상을 결정할 수 있다. 프래그먼트 프로그램은 스크린 영상의 품질에 결정적인 영향을 미치기 때문에 다양한 종류의 알고리즘이 개발되었는데, 주로 조명과 텍스쳐링에 집중된다.
◾ 텍스쳐링
텍스쳐는 대게 텍셀의 2차원 배열 형태를 가진다 (texture element의 준말. picture element의 준말인 픽셀과 구분하기 위해 사용)
정규화된 텍스쳐 좌표인 uv 좌표를 사용한다.
텍스쳐 좌표를 정점에 할당하는 작업을 표면 파라미터화라고 부른다. 이 작업을 위해서는 3차원 메쉬를 2차원 평면에 펼쳐야 한다. 보통 2차원 평면으로 펼치는 과정에서 대부분 왜곡 현상이 일어나지만 왜곡을 최소화 하는 좋은 알고리즘들이 존재한다.
그나마 파라미터화 에러를 줄일 수 있는 방법 중 하나는 메쉬를 여러개로 쪼개서 부분별로 수행하는 것이다.
스캔 변환이 완료되면 각각의 프래그먼트는 보간된 uv좌표를 가지게 된다. 이를 텍셀 주소로 매핑하는 작업은 렌더링 과정중에 자동으로 수행된다.
대부분의 경우 텍셀 주소는 부동소수점으로 표현되고 텍셀 주소가 계산되면 주변의 텍셀들을 모아서 최종적인 색상 값을 결정하는 필터링 과정이 필요하게 된다.
◾ 출력 병합
렌더링 파이프라인의 마지막 단계이다. 프래그먼트의 출력은 단순히 RGB값만 가지고 있는것이 아니라 알파값과 깊이값을 가지고 있기 때문에 RGBAZ 프래그먼트라고도 표현된다. 알파 및 깊이 값을 사용하여 프래그먼트는 컬러 버퍼의 픽셀과 경쟁하기도 하고 결합되기도 한다.
동일한 x,y 좌표에 위치한 픽셀의 출력 우선순위는 카메라에 더 가까운쪽이 그려지는것이 이치에 맞는다.
이러한 결정을 하는 알고리즘을 z-버퍼링(깊이 버퍼링)이라고 부른다.
깊이 버퍼는 컬러 버퍼와 동일한 해상도를 가지며 현재 컬러 버퍼에 저장되어 있는 z값을 저장한다. 이후 출력 병합 단계에서 둘을 비교하여 더 작은 z값으로 컬러 버퍼의 픽셀을 대체해가며 픽셀을 결정한다.
하지만 반투명 물체를 렌더링할 때에는 얘기가 조금 달라진다. 반투명한 프래그먼트의 z값이 컬러 버퍼에 있는 픽셀의 z값보다 작은 경우 기존대로라면 완전히 대체가 되지만 이때는 픽셀이 프래그먼트를 통해 비쳐서 보여야 한다.
픽셀과 프래그먼트 색상의 혼합이 일어나야 하는 것이고 이를 알파 블렌딩이라 부른다.
알파 채널은 보통 RGB 각각의 채널과 같은 크기의 비트 수를 가진다.
중요한 사실 중 하나는 불투명한 삼각형들에 대한 z버퍼링 수행은 삼각형들의 처리 순서가 상관이 없지만 반투명한 삼각형들에 대한 z버퍼링은 뒤에서부터 앞으로 순차적으로 이루어져야만 한다는 차이가 있다. 이를 위해서 반투명한 삼각형들은 정렬 되어야 하지만 간단한 문제가 아니다.
◾ Z-컬링
z-버퍼링 과정에서 버려지는 프래그먼트들은 앞선 과정에서 텍스처링 작업 등 여러 가지로 수행된 고비용 연산들이 헛수고가 된거나 마찬가지이다.
만약 프래그먼트 처리 단계에 진입하기 전에 버려질 프래그먼트라는 것을 미리 알 수 있다면 즉각적으로 버림으로써 연산량을 크게 줄일 수 있을 것이다. 이 작업은 z-컬링이라고 하고 래스터라이저의 일부 과정이다.
z-컬링 알고리즘은 스크린 전체를 감싸는 타일들을 관리하게 된다. 하나의 타일은 n*n 픽셀 영역을 맡게 되고 타일의 픽셀들 중 z값이 가장 큰 값을 저장한다. 이후 래스터라이저가 처리중인 새로운 삼각형이 해당 타일에 놓이는 경우 새로운 삼각형의 세 정점 중 가장 작은 값을 기존에 저장했던 z값과 비교하여 만약 가장 작은 값이 더 크다면 타일에 완벽하게 가려진다는 의미가 되기 때문에 해당 삼각형은 버려지게 된다.
만약 씬을 구성하는 삼각형들이 앞에서부터 뒤로 정렬되어 있다면, z-컬링을 통해 성능을 상당히 향상시킬 수 있지만 현실적으로 어려운 문제이기 때문에 대신 물체 단위로 정렬하는 방법을 택한다. 이정도만 해도 임의의 순서로 렌더링 했을 때보다 몇 배는 빨라진다.
추가로 오버드로우는 깊이 검사를 통과한 픽셀 수를 스크린의 전체 픽셀 수로 나눈 값이다. 오버드로우가 1에 근접할수록 효율적이라는 의미가 된다.
'이론 > 그래픽스' 카테고리의 다른 글
[Chapter 5] 조명 및 쉐이더 (0) | 2023.05.17 |
---|---|
[Chapter 3] 래스터라이저 (0) | 2023.05.11 |
[Chapter 2] 정점 처리 (0) | 2023.04.27 |
[Chapter 1] 폴리곤 메쉬 (0) | 2022.09.16 |