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는 초기 엔진 초기화 동안 노출되며, 현재 에디터에는 적용되지 않습니다.
예제 활용 및 응용
- 멀티 GPU 환경: 그래픽스 어댑터를 선택하여 특정 GPU에서 XR 환경을 실행할 수 있습니다. 이는 매우 중요한 설정입니다.
- Vulkan 지원: VR 환경에서 Vulkan을 사용해야 하는 경우, 공급자는 필요한 확장 리스트를 제공해야 합니다.
- EGL 초기화: Android 장치와 같은 플랫폼에서 EGL을 초기화할 때 PBuffer 또는 NO_ERROR 컨텍스트와 같은 특별한 설정이 필요할 수 있습니다.
Unity XR SDK PreInit 인터페이스는 복잡한 그래픽스 환경을 설정하는데 매우 유용하며, 특히 VR 및 AR 응용 프로그램 개발에 있어 필수적인 요소입니다.