지식이 정확하지 않은 상태에서 어설프게 정리했던 내용이라, 내용의 주를 이루는 Anti-aliasing으로 제목을 바꾸고 SSAA와 MSAA의 차이점을 명확하게 다시 정리했다.
저번 포스팅에서 카메라에 대해 얘기하며 프로젝션에 대해 다뤘었다. 3D 공간의 오브젝트를 2D 화면으로 매핑하는 내용이었다. 수학적으로는 이것으로 충분하겠지만, 물리적으로 우리의 2D 공간은 모니터가 되고, 픽셀로 이루어진 제한된 해상도를 갖게 된다. Rasterization은 이 제한된 해상도의 픽셀공간에 그리는 과정을 말한다.
위의 예제 그림을 보면, 각 픽셀이 도형내에 존재하는지 수학적 계산을 통해 판단을 하게 되고, 도형 내부라고 생각되면 해당 픽셀에 칼라가 표현된다. 수학적 계산과정은 scratchpixel 사이트를 참고하자.
문제는 위 그림에서 볼 수 있듯이, 픽셀이 블럭화되어 있어서 정확한 도형표현이 어렵다는 점에 있다. 컴퓨터 그래픽은 현실세계와 다르게 제약이 많기 때문에 사람의 눈을 속여 그럴싸하게 보이도록하는 기법들이 발달해 왔다. 여기서 블럭화된 그래픽을 보다 자연스러운 도형처럼 보여주는 방법은 anti-aliasing이란 기법이 사용된다.
먼저, anti-aliasing없이 표현된 그래픽을 보면 다음과 같이 계단현상이 발생한다.
이것을 aliasing이라고 한다. anti-aliasing을 말 그대로 이것을 없애는 방법이다. 여기에 여러 알고리즘이 존재한다.
SSAA(Super-Sample Anti-Aliasing)
슈퍼샘플 방식은 화면크기보다 크게 Rasterizaion을 한 후, 스크린 해상도로 리사이즈 하는 방식이다. 1920X1080 스크린이라면, 3840 x 2160으로 렌더링 하고 이걸 리사이즈 하는 식이다. 이 경우, 스크린보다 4배 크기의 픽셀을 갖게 되므로, 사이즈를 줄이며 4개 픽셀값의 중간값을 계산하여 픽셀을 표현한다.
MSAA(Multi-Sample Anti-Aliasing)
가장 기본적인게 멀티 샘플링(MSAA)기법이다. 위의 Raterizaion 작업시, 픽셀이 도형내에 존재하는지 검사할 때, 픽셀 중앙값을 이용해 테스트를 하게 된다. 멀티 샘플링은 이 테스트 포인트를 여러개로 늘리고, 각 테스트 포인트의 칼라를 섞어 픽셀을 표현한다.
테스트 포인트의 개수가 많을수록 더 부드러운 모습을 보여주는데, 대신 그만큼 계산량이 늘어나게 된다.
사실, 여기까지의 설명은 SSAA랑 동일하다. 차이점의 핵심은 SSAA가 전체 화면에 대해 계산한다고 하면, MSAA는 엣지, 경계 부분에 대해서만 멀티 샘플링을 수행한다. 이는 멀티 샘플에 대해 depth buffer를 이용한 계산까지는 SSAA처럼 동일하게 동작하나, depth buffer를 통해 경계인지 아닌지 여부가 판별되고, 경계가 아니라면 멀티 샘플이 아닌 하나의 샘플에 대해 쉐이더가 돌아간다. 이를 통해 계산량이 획기적으로 줄어들게 된다.
FXAA(Fast Aproximate Anti-Aliasing)
FXAA는 MSAA보다 더 빠른 성능을 위해 사용되는 기법이다. MSAA의 경우, 3D를 2D로 프로젝션하는 과정에서 테스트 포인트를 늘려 각각 3D 계산을 해줘야하는 반면, FXAA는 일단 그냥 그리고 그려진 2D 이미지를 포토샾에서 하듯 anti-aliasing하는 기법이다.
계산이 훨씬 빠르지만, 2D 이미지의 anti-aliasing기법은 주변 픽셀들의 값을 이용해 중간값을 계산하여 해당 픽셀칼라가 계산되므로, 경계만 anti-aliasing되지 않고 이미지 전체가 뭉게지는 효과가 있다.
Etc.
이 외에도 NVIDIA에서 MSAA를 발전시켜 지원하는 CSAA나, 움직임에서 발생하는 aliasing을 제거하기 위한 시간축을 이용한 TAA 기법등이 있다. TAA의 경우, 이전 프레임을 이용해 계산에 사용한다. 복잡하고 머리아프고 어렵지만, MSAA만 이해하면 충분하지 않을까?
Anti-Aliasing in Godot
Godot에서는 Project>Project settings>Rendering>Quality 에서 관련 설정을 찾아볼 수 있다.

Godot이 GLES를 사용하므로, OpenGL이 지원하는 MSAA가 사용가능하다는걸 알 수 있으며 FXAA를 지원하는 것을 볼 수 있다.