우리의 화면은 무한히 크지 않고, 제한된 픽셀의 크기로 화면을 표시하며 해당 픽셀의 색상은 일반적으로 하나의 샘플포인트
로 정해 색상을 정한다. 그렇기 때문에 특정 선과 곡선들을 완벽하게 표현하는건 불가능하다.
그렇기 때문에 계단 현상이라고하는 앨리어싱(aliasing)효과
가 나타나게 된다.
출처 : 안티앨리어싱 - Unity
보통 안티 앨리어싱
이라는 단어로 우리에게 익숙할텐데 게임 옵션 중 앨리어싱 효과를 완화시키기 위한 옵션이다.
위 사진을 보면 왼쪽이 앨리어싱 효과로 인해 계단식으로 나눠져있는 상태이고, 안티 앨리어싱을 적용하면 오른쪽과 같이 근처 색들이 보정되어 색이 섞이게 된다.
우리는 오늘 이 안티 앨리어싱의 기법에 대해 알아볼 예정이다.
SSAA(SuperSampling Anti-Aliasing)
이라고 하는 초과 표본화는 앨리어싱 제거를 위해서 우리가 화면을 그리는 데 사용하는 버퍼를
(후면 버퍼와 깊이 버퍼 모두) 화면 해상도보다 4배의 크기
로 잡고 후면 버퍼에 렌더링 한다. 그리고 화면에 출력하기위해 Presenting(후면 버퍼를 화면에 출력하기 위해 전면 버퍼와 전환)할 때 화면 해상도와 동일한 크기로 환원한다.
하양표본화(DownSampming)
라고도 하는 이 환원 과정은 4개의 서브픽셀의 색상 평균
을 그 블록에 해당하는 픽셀의 최종 색상
으로 사용하게 된다.
한 마디로 초과 표본화는 화면 해상도를 내부적으로 4배 증가시켜 계산하는 거라고 볼 수 있다.
그렇기 때문에 초과 표본화는 픽셀 처리량과 메모리 소비량이 네 배라서 비용이 아주 높다.
MSAA(MultiSampling Anti-Aliasing)
으로 불리는 다중 표본화는 초과 표본화보다는 비용이 저렴하고 결과물의 차이도 많이 나지 않아 많이 사용되는 기법이다.
우선 4X 멀티샘플링(픽셀당 부분픽셀 4개)의경우 다중 표본화도 초과 표본화처럼 화면 해상도의 4배의 버퍼를 갖는다. 하지만 다중 표본화는 픽셀당 한 번만 색상을 계산
하고(픽셀의 중심) 해당 색상을 서브픽셀의 색상으로 정하는데 만약 서브픽셀이 아래 사진처럼 삼각형 밖에 존재한다면 색상을 업데이트 하지않고 그대로 두고 마지막엔 다운 샘플링을 통해 최종 색상을 결정한다.
초과표본화는 서브픽셀의 색상을 모두 계산
하여 최종픽셀의 색상을 계산하고, 멀티샘플링은 픽셀의 중앙의 색상 단 한 번만 계산
하여 서브픽셀들의 색을 정하고, 색을 업데이트 할 지 안 할 지만 정한다.
이미지의 색을 계산한다는 건 그래픽 파이프라인에서 가중 비싼 단계 중 하나이기 때문에 그 계산을 줄이는 것 만으로 많은 성능 향상을 이룰 수 있다.
Direct3D12에서는 DXGI_SAMPLE_DESC라는 구조체를 잘 채워서 적용한다.
typedef struct DXGI_SAMPLE_DESC {
UINT Count;
UINT Quality;
} DXGI_SAMPLE_DESC;
Count를 1로하고 Quality를 0으로하면 샘플링을 하지 않는다는 뜻이다.
성능을 위해서 일반적으로 Count는 4 혹은 8로 정한다.
표본의 최대 갯수는 ID3D12::Device::CheckFeatureSupport 메소드를 통해 알 수 있다.
보통 SwapChain을 만들 때 DXGI_SWAP_CHAIN_DESC에서 이 DXGI_SAMPLE_DESC를 요구한다.
참고