안티엘리어싱의 기법 - 다중표본화(Multi Sampling), 초과표본화(SuperSampling)

개발하는 곰댕이·2023년 5월 2일
0

DirectX

목록 보기
3/8

우리의 화면은 무한히 크지 않고, 제한된 픽셀의 크기로 화면을 표시하며 해당 픽셀의 색상은 일반적으로 하나의 샘플포인트로 정해 색상을 정한다. 그렇기 때문에 특정 선과 곡선들을 완벽하게 표현하는건 불가능하다.
그렇기 때문에 계단 현상이라고하는 앨리어싱(aliasing)효과가 나타나게 된다.


출처 : 안티앨리어싱 - Unity
보통 안티 앨리어싱이라는 단어로 우리에게 익숙할텐데 게임 옵션 중 앨리어싱 효과를 완화시키기 위한 옵션이다.
위 사진을 보면 왼쪽이 앨리어싱 효과로 인해 계단식으로 나눠져있는 상태이고, 안티 앨리어싱을 적용하면 오른쪽과 같이 근처 색들이 보정되어 색이 섞이게 된다.

우리는 오늘 이 안티 앨리어싱의 기법에 대해 알아볼 예정이다.

초과표본화(Super Sampling)

SSAA(SuperSampling Anti-Aliasing)이라고 하는 초과 표본화는 앨리어싱 제거를 위해서 우리가 화면을 그리는 데 사용하는 버퍼를(후면 버퍼와 깊이 버퍼 모두) 화면 해상도보다 4배의 크기로 잡고 후면 버퍼에 렌더링 한다. 그리고 화면에 출력하기위해 Presenting(후면 버퍼를 화면에 출력하기 위해 전면 버퍼와 전환)할 때 화면 해상도와 동일한 크기로 환원한다.

하양표본화(DownSampming)라고도 하는 이 환원 과정은 4개의 서브픽셀의 색상 평균을 그 블록에 해당하는 픽셀의 최종 색상으로 사용하게 된다.

한 마디로 초과 표본화는 화면 해상도를 내부적으로 4배 증가시켜 계산하는 거라고 볼 수 있다.
그렇기 때문에 초과 표본화는 픽셀 처리량과 메모리 소비량이 네 배라서 비용이 아주 높다.

다중표본화(MultiSampling)

MSAA(MultiSampling Anti-Aliasing)으로 불리는 다중 표본화는 초과 표본화보다는 비용이 저렴하고 결과물의 차이도 많이 나지 않아 많이 사용되는 기법이다.
우선 4X 멀티샘플링(픽셀당 부분픽셀 4개)의경우 다중 표본화도 초과 표본화처럼 화면 해상도의 4배의 버퍼를 갖는다. 하지만 다중 표본화는 픽셀당 한 번만 색상을 계산하고(픽셀의 중심) 해당 색상을 서브픽셀의 색상으로 정하는데 만약 서브픽셀이 아래 사진처럼 삼각형 밖에 존재한다면 색상을 업데이트 하지않고 그대로 두고 마지막엔 다운 샘플링을 통해 최종 색상을 결정한다.

참고 : Multisampling - Vulkan Tutorial

다중표본화와 초과표본화의 차이

초과표본화는 서브픽셀의 색상을 모두 계산하여 최종픽셀의 색상을 계산하고, 멀티샘플링은 픽셀의 중앙의 색상 단 한 번만 계산하여 서브픽셀들의 색을 정하고, 색을 업데이트 할 지 안 할 지만 정한다.
이미지의 색을 계산한다는 건 그래픽 파이프라인에서 가중 비싼 단계 중 하나이기 때문에 그 계산을 줄이는 것 만으로 많은 성능 향상을 이룰 수 있다.

Direct3D의 다중 표본화

Direct3D12에서는 DXGI_SAMPLE_DESC라는 구조체를 잘 채워서 적용한다.

typedef struct DXGI_SAMPLE_DESC {
  UINT Count;
  UINT Quality;
} DXGI_SAMPLE_DESC;
  • Count
    서브픽셀의 수
  • Quality
    품질 수준(하드웨어의 제조사마다 다를 수 있음)

Count를 1로하고 Quality를 0으로하면 샘플링을 하지 않는다는 뜻이다.
성능을 위해서 일반적으로 Count는 4 혹은 8로 정한다.
표본의 최대 갯수는 ID3D12::Device::CheckFeatureSupport 메소드를 통해 알 수 있다.

보통 SwapChain을 만들 때 DXGI_SWAP_CHAIN_DESC에서 이 DXGI_SAMPLE_DESC를 요구한다.
참고

0개의 댓글