Unity XR SDK PreInit 인터페이스 가이드

이 문서에서는 Unity의 XR SDK PreInit 인터페이스에 대해 쉽게 이해할 수 있도록 설명합니다. 이 인터페이스는 그래픽스 기기가 생성되기 전에 초기 설정 작업을 수행하는 데 사용됩니다. 주로 멀티 GPU 환경에서 특정 GPU 선택, 그래픽스 확장 활성화 및 버퍼 수정 등의 작업에 활용됩니다.

개요

XR SDK PreInit 인터페이스는 네이티브 심볼 XRSDKPreInit을 익스포트하여 런타임 초기화가 시작되기 전에 호출될 수 있도록 합니다. 공급자는 이 과정에서 필요한 정보를 엔진에 제공하기 위해 UnityXRPreInitProvider 구조체를 채워야 합니다.

XRLoader 구현

Unity 프로젝트의 빌드 과정에서 XRSDKPreInit을 호출하기 위해 공급자 라이브러리의 이름이 필요합니다. 이를 위해 XRLoader에 다음 인터페이스를 구현합니다:

public string GetPreInitLibraryName(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup)
{
    return "XRSDKMyProviderLibraryName";
}

이 코드가 Unity 시작 시 실행되어 라이브러리를 로드합니다. 이후 이 라이브러리를 열고 XRSDKPreInit을 호출하게 됩니다.

PreInit 등록

다음은 초기 엔진 초기화에 사용할 콜백을 등록하는 간단한 예제입니다:

XRSDKPreInit(IUnityInterfaces * interfaces)
{
    IUnityXRPreInit* preInit = (IUnityXRPreInit*)interfaces->GetInterface(GetUnityInterfaceGUID<IUnityXRPreInit>());

    UnityXRPreInitProvider provider = { 0 };

    provider.userData = nullptr;
    provider.GetPreInitFlags = GetPreInitFlags;
    provider.GetGraphicsAdapterId = GetGraphicsAdapterId;
    provider.GetVulkanInstanceExtensions = GetVulkanInstanceExtensions;
    provider.GetVulkanDeviceExtensions = GetVulkanDeviceExtensions;

    preInit->RegisterPreInitProvider(&provider);
}

필요하지 않은 모든 콜백은 nullptr로 설정해야 하며, 각 콜백은 다음과 같은 목적을 가지고 있습니다.

콜백 이름 설명
GetPreInitFlags 플래그의 64비트 비트필드를 반환합니다.
GetGraphicsAdapterId 그래픽스 API 초기화를 위해 사용하는 그래픽스 어댑터를 설정합니다.
GetVulkanDeviceExtensions Vulkan 초기화에 필요한 특정 확장을 반환합니다.
GetVulkanInstanceExtensions 인스턴스에 대한 특정 확장을 반환합니다.

알려진 문제

  • 현재 GetPreInitLibraryName은 XRManager 프리팹의 첫 번째 XRLoader에서만 호출되므로, 첫 번째 공급자만 런타임 시점에 PreInit 엔트리 포인트를 제공할 수 있습니다.
  • PreInit는 초기 엔진 초기화 동안 노출되며, 현재 에디터에는 적용되지 않습니다.

예제 활용 및 응용

  1. 멀티 GPU 환경: 그래픽스 어댑터를 선택하여 특정 GPU에서 XR 환경을 실행할 수 있습니다. 이는 매우 중요한 설정입니다.
  2. Vulkan 지원: VR 환경에서 Vulkan을 사용해야 하는 경우, 공급자는 필요한 확장 리스트를 제공해야 합니다.
  3. EGL 초기화: Android 장치와 같은 플랫폼에서 EGL을 초기화할 때 PBuffer 또는 NO_ERROR 컨텍스트와 같은 특별한 설정이 필요할 수 있습니다.

Unity XR SDK PreInit 인터페이스는 복잡한 그래픽스 환경을 설정하는데 매우 유용하며, 특히 VR 및 AR 응용 프로그램 개발에 있어 필수적인 요소입니다.