반응형

 

개요

  • Dynamic Resolution은 런타임 중에 렌더링 해상도를 동적으로 제어하는 시스템입니다.
  • 프레임 버퍼 해상도는 유지하고 렌더링하는 영역만 조정하는 동작 방식이며 GPU 픽셀 연산과 대역폭 최적화 효과를 얻을 수 있습니다.
  • Unity6에서 동작하며, 그 이전 버전에서 옵션은 존재했지만 기본적으로 동작하지 않았습니다.
  • 렌더 패스 및 프레임 버퍼를 활용하는 기능을 개발한다면 Dynamic Resolution 지원하도록 구현해야 합니다.

 

Dynamic Resolution 기능 사용 방법

Unity6 환경 기준, Camera 컴포넌트에 "UPR Dynamic Resolution" 옵션을 활성화합니다.

Unity6 이전 버전에서는 "Allow Dynamic Resolution" 옵션으로 존재했지만, Unity 2022.3.38f1 버전 기준으로 활성화해도 동작하지 않고 URP 내장 Shader 및 RenderPass에서 기능을 지원하도록 구현되어 있지도 않습니다.

좌 : Unity6000.0.32f1 우 : Unity 2022.3.38f1

 

Dynamic Resolution 해상도 제어는 스크립트에서 "ScalableBufferManager" 클래스를 통해서 제어할 수 있으며 일반적으로 디바이스 성능 정보를 기준으로 런타임에서 동적으로 조정되도록 구현합니다.

아래는 유니티 도큐먼트 페이지에서 제공하는 샘플 스크립트입니다.

 

Dynamic Resolution 동작 원리와 최적화 이득

기본 상태

 

Dynamic Resolution 적용

 

Dynamic Resolution을 통해서 렌더링 해상도를 제어하면 위 예시와 같이, 프레임 버퍼(렌더 텍스처) 해상도는 유지하고 렌더링되는 영역만 조정합니다. 이로서 시스템 메모리에 점유하는 렌더 텍스처 용량은 변하지 않지만, GPU 픽셀 연산과 대역폭 최적화 효과를 얻을 수 있습니다.

 

Render Scale & Screen.SetResolution 옵션과 차이점

Dynamic Resolution 외에 렌더 해상도 조정 옵션은 추가로 Render Scale & Screen.SetResolution 기능이 존재합니다.

Render Scale 옵션은 실제 프레임 버퍼 (렌더 텍스처) 해상도 자체를 조정하는 옵션이며 Screen.SetResolution은 어플리케이션 해상도 자체를 조정합니다.

Screen.SetResolution과 용도 차이는 RenderScale은 Camera 렌더링 단계에서 프레임 버퍼 해상도를 조정해서 Final Blit 단계에서 다시 원본 해상도로 복구해서 UI를 해상도 조정 영향 받지 않고 선명하게 렌더링 가능하다는 점이 있습니다.

(Screen Space - Overlay UI만 해당됨)

Render Scale 옵션은 URP Renderer Asset 혹은 스크립트에서 제어 가능

 

Render Scale & Screen.RetResolution 또한 런타임 도중 동적으로 제어 가능하지만 Dynamic Resolution과 다르게 1 프레임 단위로 렌더링 해상도 제어하는 용도가 아닙니다. 왜냐하면 프레임 버퍼 해상도가 변경되면 한 프레임 렌더링에 필요한 모든 렌더 텍스처를 새로 생성해야 하기 때문에 해상도 변경 순간 프레임 히칭 및 GC 발생하여 성능 부하 발생하기 때문입니다.

(원래 렌더 텍스처를 한번 생성해 놓고 재활용하는 방식으로 동작함)

 

그래서 Dynamic Resolution은 Adaptive Performance와 같이 디바이스 온도나 프레임 레이트 정보를 기반으로 프레임 단위로 렌더링 해상도 제어하는 용도로 사용합니다.

추가로 Dynamic Resolution 또한 Final Blit 단계에서 원본 해상도로 복구하기 때문에 Screen Space - Overlay UI 해상도에 영향주지 않습니다.

 

Dynamic Resolution Shader & RenderPass 지원 방법

Unity6 버전으로 오면서 내장 Shader 및 Blitter 클래스의 코드가 많이 변화되었으며, 그 중에서 아래와 같이 이름만 봐도 Dynamic Resolution과 연관되어 보이는 변수 & 함수들이 확인됩니다.

Unity 6000.032f1 - Blit.hlsl

 

Unity 6000.1.9f1 기준, 이와 관련해서 내장 Shader 및 구현 로직을 확인해본 결과.

대부분 UV 처리 관련 코드는 Blitter 클래스 및 Blit.hlsl와 같은 편의성 헬퍼 클래스를 위한 기능으로 확인되며

화면에 꽉차게 그리는 렌더패스 스타일 기준으로 Dynamic Resolution은 애초에 Viewport 자체를 화면 버퍼보다 작게 세팅되기 때문에 별도 대응할 필요 없습니다.

(혹시 제가 모르는 무언가가 있다면 댓글로 알려주시면 감사드립니다.)

 

다만 Bloom & DoF와 같은 다운샘플링 & 블러 처리하는 효과 구현에서는 보통 _BlitTexture_TexelSize와 같은 RenderTexture 사이즈와 텍셀 정보 데이터를 이용하게되는데, Dynamic Resolution을 사용하는 경우, 실제 Viewport 사이즈만 조절되기 때문에 이에 대한 대응은 필요합니다.

(Unity 6000.0.32f1 기준, URP Bloom이 이 대응이 안되있어서 Dynamic Resolution으로 해상도 낮추면 Blur가 더 퍼짐.)

 

PostProcessUtils.SetSourceSize 함수를 이용한다면, 내부에서 DynamicResolution의 해상도 값을 통해 _SourceSize라는 변수 명으로 셰이더 글로벌 상수 버퍼로 전달할 수 있습니다. _BlitTexture_TexelSize를 _SourceSize 로 대체하면 다운 샘플링 & 블러 처리에 Dynamic Resolution 대응 가능합니다.

 

그 외로 Dynamic Resolution은 _GlobalMipBias에도 영향을 주는데, 조정된 렌더 해상도에 알맞는 MipBias가 설정되기 위함으로 보입니다. 일반적인 화면 효과 RenderTexture에는 Mipmap을 생성하지 않아서 신경 안써도 되지만, RenderObject Pass를 제작하는 경우에는 신경써야 합니다.

(Dynamic Resolution으로 절반 해상도로 만들면 MipBias를 -1.0로 Offset 시키는 원리)

 

 

 

 

반응형

WRITTEN BY
CatDarkGame
Technical Artist dhwlgn12@gmail.com

,