✌️개요
2024 .04 수정
Unity의 Dynamic Resolution이란
원하는 Camera를 정해서 런타임 시 현재 퍼포먼스에 맞춰서 그 Camera의 해상도가 동적으로 조정되게 하는 기능이다.
비슷한 작업으로는 Upscale Sampling이있다.
Upscale Sampling은 Camera가 렌더텍스쳐에 렌더링하게 설정해두고 렌더텍스쳐의 해상도를 조절하는 방식이다.
둘다 결과적으로 하는일은 비슷하다.
중요한건 UI의 해상도는 그대로 두고 인게임 렌더링의 해상도만 열화를 시켜야 티가 덜나게된다.
📌이 글은 Unity 2020 3.35버전, 안드로이드 플랫폼, Built-in 파이프라인을 기준으로 설명합니다.
🔥본문
먼저 사전준비를 해보자
1. Player세팅에서 Frame Timing Stats를 활성화
코드에서 CPU와 GPU의 Frame Time을 캡쳐하기 위해 활성화를 해줘야 한다.
2. 기능을 활성화 할 Camera컴포넌트의 Allow Dynamic Resolution 활성화
필요한 카메라만 켜주면 된다.
주로 프레임이 제일 안뽑히는 장면의 카메라가 될것이다.
3. 그래픽스 API 설정
Dynamic Resolution 기능은 그래픽스 API를 가린다.
iOS, macOS는 Metal API
안드로이드는 Vulkan API
윈도우는 DirectX 12
위 그래픽스 API만 지원한다.
안드로이드 기준으로 유니티 Player세팅에서 Auto Graphics API를 꺼주고
Vulkan을 맨위로 올려준다.
4. 샘플 코드를 가져오자
https://github.com/Unity-Technologies/DynamicResolutionSample/blob/main/DynamicResolution.cs
위 링크의 스크립트를 가져와서 빈 오브젝트를 만들고 달아주자.
근데 Built-in 파이프 라인이라면
4번줄 #define PIPELINE_IMPLEMENTS_DRH
부분을 주석 처리해주자
그리고 추가로 작동을 하는지 확인을 위해 디버그 UI 기능도 스크립트에 포함돼있다.
활성화를 위해 7번줄 // #define ENABLE_DYNAMIC_RESOLUTION_DEBUG
부분의 주석을 풀어주고,
폰트가 너무 작으니 319번줄을 DebugStyle.fontSize = 40;
으로 두배 늘려주자
5. 쉐이더들을 고쳐주자
이제 플레이를 해보면 왼쪽위에
이런 디버그 UI가 표시되고, 빌드를 해서 확인해보면 퍼포먼스가 떨어질 때 해상도가 열화되면서 대응하는 모습을 볼 수 있다!
😮하 지 만
만약 이 작업전에 OpenGL 그래픽스API로 작업중이었다면 필시 이상하게 나오는 쉐이더들이 몇몇 보일것이다.
아예 magenta색으로 나오거나 아니면 먼가 이상하거나
그러면 해당 쉐이더 코드를 열어서 봐보자
이런 부분이 있을것이다.
#pragma only_renderers d3d9 d3d11 glcore gles gles3 metal d3d11_9x
위 줄은 명시된 API가 아니면 컴파일 안한다는 것이기 때문에 주석처리 해버리고
#pragma target 3.0
위 줄은 컴파일 타겟이다 자세한건 맨 아래 Doc링크를 걸어둘거고 Vulkan과 Metal을 둘다 지원할려면 4.5 이상으로 바꿔준다.
6. 완료!
이제 빌드에서 확인하면 쉐이더들도 잘 나오고 Dynamic Resoultion도 잘 작동한다.
같은 빌드에서
S22 울트라는 Scale Factor
0.9 ~ 1 을 유지했고
S9+는 Scale Factor
0.5 ~ 0.6 을 유지했다.
(0.5까지 떨어지면 티가 많이나긴 한다 물론 최소치도 설정은 가능하다.)
참고로 맞추고싶은 프레임 레이트를 변경하고 싶다면 위의 4번 항목에서 가져온
DynamcResolution.cs 스크립트에서
14번 줄 static double DesiredFrameRate = 60.0;
을 원하는대로 바꿔주면 된다.
끝!
🔗링크
쉐이더 컴파일 타겟 설명 문서
Dynamic Resolution 공식문서
'Unity > Tips' 카테고리의 다른 글
[Unity] 프로젝트 시작과 함께하는 에셋들 추천 - 무료 에셋 편 (1) | 2024.04.26 |
---|---|
[Unity] 동적 다운로드한 이미지 에셋 수동으로 메모리에서 내리기 (0) | 2024.03.20 |
[Unity] 유니티 에디터 OpenGL/Vulkan 그래픽스API로 열기 (0) | 2023.08.02 |
[Unity] Adressable에셋 코드로 링크(인스펙터 등록)하기 (0) | 2023.06.24 |
[Unity] Scene뷰에서 축 아이콘 없이 스크린샷 찍기 (0) | 2022.11.01 |