유니티 VR Compositor Layers를 이용해서 선명한 UI 연출하기 #OVR Overlay

VR로 게임을 하다보면 UI가 선명하지 않아서 보기 불편한 적이 많으셨죠? 특히 2D UI의 경우 Text가 읽기 매우 불편한데요, 오늘 OVR Overlay 컴포넌트를 이용해서 약간 해결해보고자 합니다.

출처 - https://developers.meta.com/horizon/documentation/unity/unity-ovroverlay/?locale=ko_KR

OVROverlay는 Compositor Layer를 사용해서 텍스처를 애플리케이션 렌더링 경로를 거치지 않고 직접 디스플레이로 전달하므로, CPU와 GPU 리소스를 절약하면서 선명한 이미지를 제공하도록 도와주는 컴포넌트입니다.


Compositor Layer란?

Compositor Layer는 VR 애플리케이션의 렌더링 과정을 최적화하여 텍스처, UI, Video와 같은 요소를 효율적으로 디스플레이에 출력하는 방식입니다.
Compositor Layer 방식은 Eye Buffer(전통적인 VR 렌더링 파이프라인 단계)를 거치지 않으면서도, 왜곡 보정(Meta Quest 렌즈는 왜곡되어 있기 때문에, 그에 맞게 보정을 해주어야 함)을 포함한 렌더링 작업을 수행합니다.


Eye Buffer란?

출처 - https://www.reddit.com/r/OculusQuest/comments/j9z6vh/quest_2_updates_for_ironlights_huge_jump_in/?rdt=63628

Eye Buffer는 VR 렌더링 과정에서 양쪽 눈에 보여줄 이미지를 준비하는 가상의 작업 공간입니다. VR에서는 왼쪽 눈과 오른쪽 눈이 약간 다른 시점의 화면을 봐야 하는데, Eye Buffer는 각 눈에 맞는 이미지를 따로 생성해 저장하는 단계라고 생각하시면 됩니다. 최종적으로 Eye Buffer에 저장된 이미지는 컴포지터가 렌즈 왜곡을 보정하는 데 사용됩니다.

 

 

 

Eye Buffer 해상도는 높지만 디스플레이에 출력될 때의 해상도는 낮아지는데 다운샘플링을 하기 때문입니다. Eyebuffer의 크기를 늘리면, 보간 과정에서의 데이터 손실을 줄여 블러를 완화할 수 있기 때문입니다. (하지만,  샘플링 단계가 많아질수록 블러가 누적됩니다.)

 

이는 VR 환경에서 중요한 요소인 렌즈 왜곡 보정안티에일리어싱 품질을 유지하기 위해 디스플레이에 출력될 때는 다운샘플링이 이루어지며, 이 과정에서 해상도가 낮아집니다. 


왜 Eye Buffer 해상도가 더 높을까?

  1. 렌즈 왜곡 보정
    • VR 렌즈는 중심부에서 가장 선명하고, 가장자리로 갈수록 왜곡이 발생합니다. (사람 눈과 비슷함)
    • 왜곡 보정을 수행하려면, 더 높은 해상도로 이미지를 준비한 뒤, 이를 왜곡된 형태로 조정해야 합니다.
    • 만약 Eye Buffer의 해상도가 낮다면, 왜곡 보정 과정에서 이미지 품질이 더 크게 손실되기 때문입니다.
  2. 안티에일리어싱(AA)
    • 높은 해상도의 Eye Buffer는 렌더링된 장면의 가장자리에서 발생하는 계단 현상(jaggies)을 최소화 할 수 있습니다.
    • 안티에일리어싱을 적용해 부드러운 이미지 품질을 유지하려면 고해상도 렌더링이 필요합니다.
  3. 슈퍼샘플링(SS)
    • 고해상도 렌더링 후 다운샘플링하여 텍스처 품질을 높이고 깜빡거리는 현상을 줄이는 방식입니다.

왜 디스플레이에 출력될 때 다운샘플링이 필요한지?

  1. 디스플레이 해상도의 제한
    • Meta Quest 2와 같은 VR 디바이스의 디스플레이는 보통 1,832x1,920 (눈당 해상도)와 같은 고정 해상도를 가집니다.
    • 반면, Eye Buffer의 해상도는 일반적으로 디스플레이 해상도보다 더 높게 설정됩니다.
      예: 1.25x 또는 1.5x 스케일링 팩터를 적용한 해상도.
  2. 다운샘플링의 이점
    • 다운샘플링은 고해상도의 Eye Buffer 이미지를 디스플레이 해상도로 축소하는 과정으로 픽셀 사이의 디테일이 더 부드럽게 보이게 하고, 플리커를 줄여줍니다.
  3. 렌더링 최적화
    • VR에서 높은 Eye Buffer 해상도를 그대로 유지하면 GPU 부하가 급격히 증가할 수 있기 때문에 다운샘플링을 통해 성능을 유지하면서도 화면 품질을 보장해야 합니다.

Compositor Layer와 일반 렌더링의 차이

항목 일반 렌더링 Compositor Layer
경로 Eye Buffer → Compositor → 디스플레이(렌즈) Compositor → 디스플레이(렌즈)
샘플링 횟수 2번 (텍스처 → Eye Buffer → 디스플레이) 1번 (텍스처 → 디스플레이)
성능 CPU/GPU 리소스 더 많이 사용 리소스 절약, 최적화된 성능
선명도 샘플링 과정에서 품질 저하 발생 가능 원본 품질 그대로 렌더링

 


Compositor Layer 사용 시 주의사항

  1. 레이어 수 제한
    • 최대 15개의 Layer를 지원합니다.
    • 초과 시 Planar 요소를 RenderTexture로 결합합니다.
  2. Underlay 사용 주의
    • 투명도(Alpha) 설정이 필요한 경우 알파 채널 처리를 신중히 설정해야 하는데 그 이유는 성능 이슈 때문입니다.
  3. GPU 비용 고려
    • 비디오 재생 또는 동적 텍스처 사용 시 GPU 리소스 부담이 (많이)증가할 수 있습니다.
  4. 레이어 병합 최적화
    • Fixed-to-View Layer는 자동으로 병합되어 추가 성능 비용 절약할 수 있습니다.
  5. 고정적인 레이어당 비용
    • Meta Quest 2 (CPU/GPU 레벨 4) 기준, 레이어 하나당 약 0.1ms의 고정 비용이 추가됩니다.

 

내용이 너무 많아서.... 다음에 실습으로...