언리얼 엔진4에서는 디폴트 안티 앨리어싱 방식으로 TAA(Temporal Anti-Aliasing) 방식을 채택했다가 최근 언리얼 엔진 5로 넘어오면서 TSR(Temporal Super Resolution)가 디폴트 방식으로 채택됐다.
TAA는 선명도 문제로 인해 해외에서는 꽤 일찍부터 논란이 됐던 이슈이다.(해외 커뮤니티 Reddit에서는 아예 FuckFAA라는 서브 Reddit이 개설되어 여러 게임에서 TAA를 강제로 끄는 법을 공유하고 배포하고 있다.)
www.reddit.com/r/FuckTAA
TAA(Temporal Anti-Aliasing)
언리얼 엔진4에서 디폴트 안티 앨리어싱 방식이다.
TAA는 기존의 공간축 선의 안티 앨리어싱이 아닌 시간축 선의 후처리 안티 앨리어싱을 적용한다.
이전의 프레임 버퍼를 보관했다가 현재 프레임 버퍼와 합쳐서 새로운 화면을 만들어 낸다. 따라서 정지화면에서는 이전 프레임과 현재 프레임이 같으므로 화면 전환이 없다면 추가적인 연산을 필요로 하지 않는다.
TAA의 장점은 프레임에 가해진 MSAA(폴리곤 외곽선이 지나가는 곳만 sampling AA를 주는 방식)를 TAA의 샘플 개수만큼 증폭시키는 효과를 추가 연산 없이 적용할 수 있다는 점이다. 예를들어 4x MSAA와 2x TAA를 합치면 8x의 효과를 추가 연산 없이 가진다.
TAA의 치명적인 단점은 서로 다른 화면을 섞는 과정에서 필연적으로 일어나는 외곽선 붕괴와 하나의 상이 흐릿하게 분열되어 여러 상이 맺히는 고스트 현상이 발생한다는 것이다. 이전 프레임을 참고하기 때문에 프레임이 높을수록 이러한 현상은 줄어들지만 반대로 고사양 게임에서 프레임이 안나오는 경우 이전 프레임과 간극차가 크기 때문에 이러한 문제점이 심화된다.
커맨드(`키)로 TAA 혼합 비율을 변경할 수 있다.
- TAA: r.TemporalAACurrentFrameWeight 0.2 (현재 프레임과 이전 프레임의 혼합 비율로 0.04가 디폴트)
TAA를 킨 상태에서 정지상태와 움직이는 상태 비교
TAA 정지상태(왼쪽)와 TAA 움직이는 상태(오른쪽)
TAA를 키고 움직이는 상태(왼쪽) TAA를 끄고 움직이는 상태(오른쪽)
사진을 눌러서 방향키로 움직이며 비교해보면 더 극적이다.
오히려 움직이는 상황에서는 TAA를 끄는 것이 더 좋은 퀄리티를 보여준다.
TSR(Temporal Super Resolution)
TSR은 언리얼 엔진5의 디폴트 안티 앨리어싱 방식이다. 기본적으로 TAA처럼 시간축을 기반으로 하기 때문에 마찬가지로 이전 프레임을 참고한다. 플랫폼에 구애받지 않고 업스케일링 퀄리티에 중점을 두어 TAA 업샘플링보다 훨씬 낮은 내부 해상도를 렌더링한다. 따라서 TAA 방식보다 프레임이 더 잘나온다고 한다.(테스트해보니 비슷하다)
프레임이 잘나오게 되면 움직이는 환경에서 이전 프레임과 괴리가 줄어드므로 TAA에 비해 상대적으로 외곽선 붕괴와 고스팅 현상도 줄어들게 된다.
위에서 봤듯이 안티앨리어싱이 좋은 상황도 발생하고 나쁜 상황도 발생한다. 움직일때 TAA 품질이 떨어진다고 해서 TAA를 안쓰는 게임은 없다. 따라서 문제점을 파악하고 적절하게 해결해야한다.
특히 2022년 언리얼 엔진5가 공개되고 2년~3년이 지난 지금 언리얼 엔진5을 사용한 AAA게임들이 슬슬 출시되고 있고, 5 버전의 대표적인 기능인 Lumen과 Nanite와 관련하여 유저들의 평이 갈리고 있으니 참고할 것
Nanite Performance is Not Better than Overdraw Focused LODs [TEST RESULTS]. Epic's Documentation is Dangering Optimization.
IMO the poor performance and bugs in Remnant 2 are features inspired by a certain souls game. Btw absolutely love the complexity of R2!
forums.unrealengine.com
문제점
1. 많은 게임이 TAA를 키거나 AA 자체를 끄는 방식 두 가지를 선택하도록 강제한다. 중간지점의 대안이나 non-temporal AA 방식을 제공하지 않는다.
2. TAA는 모션 블러와 비슷한 효과를 내어 멀미를 유발할 수 있다.
3. 개발자가 TAA나 TSR에 의존하여 문제가 발생한다. 게임 그래픽 품질을 높이고자 nanite와 같은 최신기술을 막무가내로 사용하고 프레임이 안나오자 TAA나 TSR같은 기술에 의존하게 되면 다시 TAA로 그래픽 품질을 낮추는 셈이 되니 이는 모순되는 행동이 된다.
해결 방법
1. TAA의 강도를 유저가 조절할 수 있게 프리셋을 제공한다. 이는 단순히 안티 앨리어싱만 바꿀게 아니라 텍스처 퀄리티와 반사 강도 변경을 세분화하여 유저가 본인 하드웨어 스펙과 기호에 맞게 바꿀 수 있게 해야한다. 배틀그라운드는 유저들이 국민옵션이라는 세팅값을 공유한다. 이처럼 유저 스스로가 취할껀 취하고 버릴껀 버릴 수 있도록 제공해야한다.
2. 고성능 GPU에서 DLSS나 TAA, TSR로 60fps을 겨우 도달할 수 있을 수준(예전 게임들은 콘솔기기가 60fps가 한계라 60fps을 기준으로 잡았다. 그러나 요즘 PS5 PRO도 그렇고 120fps까지 지원하는 추세)이라면 nanite가 아니라 고전적인 LOD 방식으로 개발자가 애셋 품질을 조절하는 것을 고려해볼만 하다. 2번 문제의 모범사례(?)로 스타필드가 있다. 감당 안되는 프레임 방어 실패와 발적화 및 이해할 수 없는 그래픽 세팅값 나누기로 욕을 한바가지 먹었다.
안티 앨리어싱은 프레임에 민감한 게임과 민감하지 않은 게임 모두에게 중요한 기능이 되겠다.
밀리세컨드만에 승패가 결정나는 FPS 게임 같은경우는 그래픽 품질을 약간 포기하더라도 프레임 향상을 원하는 유저가 많을 것이다. 실제로 안티앨리어싱 자체를 끄고 사용하는 유저도 많다. (예를들어 레인보우 식스 같은 경우 유저의 만족도를 위해 다양한 안티 앨리어싱을 지원한다. FXAA, MSAA2, TXAA2, TAA, MSAA4, TXAA4)
반대로 프레임에 민감하지 않은 게임들 같은 경우는 프레임을 약간 포기하고 선명한 그래픽 품질을 원할 것이므로 이 경우에도 안티 앨리어싱 기능이 중요한 역할을 할 수 있다.
'Unreal Engine' 카테고리의 다른 글
Unreal Engine에서 C++ STL 컨테이너가 쓰이지 않는 이유 (0) | 2025.01.20 |
---|---|
내배캠 3일차 Unreal Engine Blueprint 과제 (0) | 2024.12.18 |