Game Programming/Rendering

Rendering :: anti-aliasing

VallistA2016. 8. 18. 16:06



(사진 1. A-A 적용한 사진과 적용 하지 않은 사진 

출처 : http://solidlystated.com/software/from-dust-anti-aliasing/)


Aliasing 현상은 위 사진에서 왼쪽에 보이듯 렌더링된 오브젝트등을 사용시에 픽셀 조각이 튀어 계단현상이 일어나는 것을 말한다.

Anti-Aliasing (AA)는 말 그대로 Aliasing을 해결하기 위한 기술이며 3D,2D 할 것 없이 모두에 쓰이는 곳이다.


Aliasing의 발생은 게임의 전반적인 퀄리티 하락에 영향을 미치며 이 현상을 근본적으로 해결하는 방법에 대해서는 수많이 나온 피해가는 방법은 있어도 해결하는 방법에 대해서는 없다고 보면 된다.


벡터로 만든 오브젝트에 대해서는 Aliasing이 일어나지 않는다. 왜냐하면 벡터로 만든 오브젝트들은 수학적인 계산을 통해서 이미지를 리사이징 하기 때문이며 기본적인 비트맵 샘플의 경우 원본보다 해상도가 높아지거나 낮아지면 Aliasing 현상을 볼 수 있다. 왜 그런가하면 우리의 디스플레이와 실제로 만든 오브젝트의 매칭시에 픽셀 조각이 정확한 위치에 위치하지 않기 때문이다. 모니터라고 하더라도 무한의 픽셀 공간이 아니기 때문에 어쩔수 없이 일어나는 현상이라고 볼 수 있다.


이미지만 나오는 것이 아닌 폰트에서도 상당한 문제가 발생하는데, 안티에일리어싱이 없으면 안되는 부분중에 하나다.


(사진 2. 확대한 폰트와 원래 크기의 폰트 

출처 : http://www.tutorial9.net/tutorials/photoshop-tutorials/super-crisp-font-anti-aliasing-in-photoshop-with-sub-pixel-hinting/)


사진 2) 에서 볼 때 첫번째 글씨는 두번째 글씨를 높였을 때의 문제이다. 

이러한 dot들이 늘어나게 되어 제 자리를 못찾으므로써 이러한 aliasing이 생긴다. 

그러므로 폰트에는 anti-aliasing을 적용을 하게 되었으며 효과를 상당히 많이 보는 영역이다.


anti-aliasing 이 기술 자체가 성능을 먹는지라 최적화 하기 위해서 수많은 기술들이 나와있으며 그 기술중 몇가지를 보도록 하자.


1. FSAA(SSAA)


FSAA (Full-scene anti-aliasing) / SSAA (Super sampling anti-aliasing)은 주변의 사물을 샘플링할 때 배수라는 개념에 배수를 추출하는 샘플의 갯수를 말한다.



(사진 3. FSAA 미적용 / 적용

출처 : http://www.anandtech.com/show/592/5)


쉽게 말하자면 해상도를 높이는 것이라고 보면된다. 

1920*1080의 해상도의 게임을 위 사진과 같이 4X FSAA를 준다면 해상도를 3840*2160으로 돌리는 것과 똑같은 부하를 먹게된다.


물론 그만큼 뛰어난 성능을 보여주지만 성능을 많이 먹게되며 특히 메모리와 계산을 많이 먹게된다.

색이 섞이는 문제가 존재하며 완벽하진 않지만 현재 존재하는 방법중 가장 퀄리티가 높게 된다.


이 방법론에는 여러가지 구현방법이 존재하는데 몇가지를 알아보도록 하자.


SGSSAA (OGSSAA)


SGSSAA (Sparse-Grid Supersampling Anti-Aliasing) / OGSSAA (Ordered-Grid Supersampling Anti-Aliasing)



(사진 4. AA 적용 / SGSSAA 적용

출처 : http://www.geforce.com/whats-new/articles/dark-souls-ii-tweak-guide)


이 방식은 샘플링의 배수 (위에서 배수라는 개념) 만큼 화면의 시점을 바꾸면서 여러개의 화면을 만들어서 여러개의 화면 만든 것들을 합쳐 결과물을 만든다.


위의 사진에서 4x SGSSAA 라는 것은 4배수, 즉 4개의 화면을 만들어서 하나로 합친 것이다.


물론 이것도 문제가 존재하는데 위의 FSAA 처럼 해상도를 괴랄하게 4배 늘리는게 아니라 똑같은 화면을 조금씩 바꿔간 것을 4개를 만든 것이기 때문에 이 4개의 화면에서 합쳤음에도 불구하고 결과 값을 제대로 못가져오는 경우가 있다.

이 경우는 픽셀 경계선, 즉 배경과 front의 오브젝트가 겹칠때 다른 정보가 들어와서 '블러링' 이라는 현상이 발생한다.


Down Sampling



(사진 5. 8xMSAA / 4K Dynamic Super Resolution)


샘플링의 배수만큼 해상도를 확대하여 화면을 만들어서 만들어진 화면을 출력 해상도에 맞춰 Down-Sampling 하는 아주 쉬운 방법이다.

위의 사진은 NVIDIA에서 그래픽 카드 드라이버에서 설정과 블러링 필터를 추가한 DSR(Dynamic Super Resolution)을 개발했다.


HSAA


HSAA (Hybrid Sampling Anti-Aliasing)


OGSSAA + MSAA 결합한 것 OGSSAA 파트에 쉐이더를 사용하므로써 커스터마이징 가능성을 높였다. 다만 DX9에서는 프로그래머블 파이프라인상에 매칭이 안되는 오류가 있어 HDR/디퍼드 와 같은 후처리 형태에 문제가 생김.


2. Texture Filtering 


텍스쳐는 이미 정해져 있는 형태의 그래픽이며 이러한 그래픽을 적용할 때 늘리거나 움직이면 aliasing이 일어나는데 이러한 해결을 위하여 AA를 텍스쳐 단위에 거는 것은 비효율적인 작업이기 때문에 텍스쳐에만 독자적으로 해결하는 방법이다.


완성된 텍스쳐 그래픽 위에 피, 탄알등 추가적으로 덧 씌워지는 기술이 생김에 따라 한계성이 명확해져서 잘 쓰지 않는다.


3. MSAA


MSAA(Multi Sampling Anti-Aliasing)


SSAA는 메모리 및 계산이 매우 무겁기 때문에 성능이 좋지 않은 컴퓨터에서는 문제가 일어날 수 밖에 없었으며 이러한 문제를 해결하기 위해 대두된 것이 MSAA 기술이다. 


쉽게 말하자면 폴리곤의 외곽선이 지나가는 곳만 Sampling AA효과를 주는 것이다. 폴리곤 외곽선이 지나가는 것을 체크하는 Dummy를 만든 후 추출하여 외곽선이 지나가면 컬러를 추출하여 섞는다.


텍스쳐에는 적용이 안되는게 흠이다.


화면 품질이 완벽하진 않아도 어느정도 보간이 되었고 성능도 괜찮게 나오는 편이라 옛날엔 많이 썻었지만 하드웨어의 비약적인 발전과 수많은 기술의 등장으로 점점 묻히고 있다.


최근엔 포워드 렌더링이 아닌 조명을 수많게 쓰는 게임에서는 디퍼드 렌더링을 기본적으로 깔고 가기때문에 프로그래머블 파이프라인 시점에서 MSAA가 먼저 연산이 되고 후 처리에서 조명과 섞어지므로 후 처리에서의 AA 효과랑 매칭이 안되어 상성이 좋지 못하다. 


DX10 이상부터는 프로그래머블 파이프라인이 증축됨에 따라서 후처리 이후로 연산 과정을 미룰 수 있어서 해소가 되었다.


4. RSAA


Rotated Sampling Anti-Aliasing 


MSAA의 기존 체크 방식은 격자형으로 폴리곤 외곽선의 색을 추출하는 방법이었는데, RSAA는 여기서 45도 정도를 뒤틀어 색을 추출하여 보간한다. 일반적으로 Aliasing이 일어나는 경우는 수직/수평이 아닌 대각선 또는 비스듬한 선으로 이루어지기 때문에 잘 체크를 할 수 있다.


5. FXAA


Fast Approximate Anti-Aliasing


후처리 AA 기술이며 MSAA와 같은 종류의 고성능 근삿값을 가져온다. 

FXAA는 픽셀 쉐이더의 종류라고 볼 수 있으며 프로그래머블 파이프라인에서 픽셀 쉐이더는 정점쉐이더가 처음에 실행되고 가장 마지막 지점에서 픽셀을 배합하기에 후 처리가 될 수 밖에 없으며 이러한 것을 이용했다. FXAA는 GPU의 계산 API에 의존되지 않으며 그래픽카드를 타지 않는다는 장점이 있다.


MSAA와 비교하여 FXAA는 빠르고, 메모리 점유율이 낮고 픽셀이 흐릿해지지 않는다.


FXAA는 밝기를 분석하여 바뀌는 곳을 기반으로 외곽선을 추출하여 이 외곽선의 90도 방향으로 AA를 넣는다. 즉 세밀한 곳에는 약하다는 단점이 있다. 

'Game Programming > Rendering' 카테고리의 다른 글

DX 9 :: 3차원의 대해서 알아보기  (0) 2016.02.24
DX 9 :: 전체화면  (0) 2016.02.19
DX 9 :: Direct3D 시작  (0) 2016.02.17
DX 9 :: 리얼타임 메시지 루프  (0) 2016.02.16
DX 9 :: 윈도우 생성  (1) 2016.02.16

댓글

VallistA

병특이 끝나서 게임에서 웹으로 스위칭한 프로그래머.
프로그래밍 정보등을 공유합니다.
현재는 이 블로그를 운영하지 않습니다.
vallista.kr 로 와주시면 감사하겠습니다!

자고 싶습니다. ㅠㅠ

Github      :: 링크

궁금한점 문의 주시면 답변드리도록 하겠습니다

VISITED

Today :

Total :

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment