기술 자료

Unity Engine

Unity Engine

프레임버퍼 방향

Explains how to manually match the application's frame buffer to the Android device's native orientation.
읽는 시간 2분최근 업데이트: 한 달 전

애플리케이션의 프레임버퍼 방향이 기기의 네이티브 디스플레이 방향(대부분의 기기에서는 세로)과 일치하지 않는 경우 Android는 매 프레임마다 기기의 디스플레이와 일치하도록 애플리케이션의 프레임버퍼를 회전시킵니다. 기기의 하드웨어 성능에 따라 이러한 추가 회전은 성능에 부정적인 영향을 미칠 수 있습니다. 애플리케이션에서 Vulkan 그래픽스 API를 사용하고 기기에서 Vulkan을 지원하는 경우 Unity는 렌더링 중에 이 회전을 적용하여 회전의 성능 영향을 줄일 수 있습니다. 이를 사전 회전이라고 합니다.

Unity에서 사전 회전 사용

Unity에서 사전 회전을 적용하기 위해 C# 스크립트 또는 Unity 에디터를 사용할 수 있습니다.
  • C# 스크립트: PlayerSettings.vulkanEnablePreTransform을
    true
    로 설정합니다.
  • Unity 에디터 사용:
    1. Edit > Project Settings를 선택합니다.
    2. Player Settings 창에서 Player 탭을 선택하고 Android Player Settings를 엽니다.
    3. Other Settings 섹션에서 Apply display rotation during rendering을 활성화합니다.

Unity에서 사전 회전 적용 방법

Unity는 렌더 텍스처에 렌더링할 때가 아니라 기기의 백버퍼에 직접 렌더링할 때 사전 회전을 적용합니다. 회전을 적용하기 위해 Unity는
UNITY_MATRIX_MVP
및
UNITY_MATRIX_P
빌트인 셰이더 변수에 영향을 주는 투사 매트릭스를 수정합니다. 즉, Unity는 버텍스 셰이더에 회전을 적용합니다.
사전 회전을 사용하면 Unity의 C# API 동작에 영향을 미치지 않습니다. 예를 들어
Screen.width
를 사용하여 화면 너비에 액세스할 수 있습니다. 뷰포트와 시저 사각도 마찬가지입니다. Unity는 필요에 따라 이 값을 조정하며, Grab Pass, ReadPixels, Screenshot 등과 같은 백버퍼의 리드백(되읽기) 작업도 처리합니다.
Unity는 셰이더에서 특수한 경우를 처리하기 위한 유틸리티 매크로를 제공합니다(자세한 내용은 아래의 제한 사항 섹션 참조).
UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION 매크로는 다음의 모든 조건이 true일 때에만 정의되고, 그렇지 않으면 정의되지 않습니다.
  • Player Settings에서
    preTransform
    이 활성화되었습니다.
  • 플랫폼이 Android로 설정되었습니다.
  • 그래픽스 API가 Vulkan으로 설정되었습니다.
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM은 현재
preTransform
회전으로 설정된 상수입니다. 이 값은 다음 중 하나입니다.
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_0
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_90
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_180
  • UNITY_DISPLAY_ORIENTATION_PRETRANSFORM_270
UNITY_PRETRANSFORM_TO_DISPLAY_ORIENTATION이 정의되지 않거나, 렌더 텍스처로 렌더링되면 UNITY_DISPLAY_ORIENTATION_PRETRANSFORM 값은 UNITY_DISPLAY_ORIENTATION_0입니다.
UNITY_DISPLAY_ORIENTATION_PRETRANSFORM은 Vulkan 한정 상수로 변환되므로 if 또는 switch 문에서 효율적으로 사용할 수 있습니다.

제한

다음과 같은 경우 preTransform을 활성화하려면 Unity 프로젝트를 사용하기 전에 추가 수정이 필요할 수 있습니다.
  • Unity의 투사 매트릭스를 사용하지 않는 셰이더
  • 프래그먼트 셰이더에서 현재 픽셀 위치에 종속되는 셰이더(
    SV_Position
    )
  • 스크린 공간 파생물(ddx, ddy)을 사용하는 셰이더
  • Vulkan 스왑체인 이미지를 사용하는 네이티브 렌더링 플러그인을 수정해야 할 수 있음
  • 다른 렌더 텍스처와 더불어 MRT 설정의 Unity RenderPass API와 함께 백버퍼 사용
이러한 경우는 백버퍼로 직접 렌더링할 때만 적용됩니다.

추가 리소스