このインターフェースでは、グラフィックスデバイスが作成される前にその設定を行うことができます。一般的な使用例としては、マルチ GPU シナリオでの特定の GPU の選択、グラフィックス拡張の有効化、バッファ作成の変更などがあります。
プロバイダーは、ネイティブのシンボル XRSDKPreInit
をエクスポートすることができます。このシンボルは、ランタイム初期化の早い段階、つまりグラフィックスデバイスの作成前に呼び出されます。プロバイダーは、UnityXRPreInitProvider
構造体に、初期化中に必要な情報をエンジンに提供するための関連エントリーポイントを記入する必要があります。プロバイダーが初期化できるようになる前にグラフィックデバイスが作成されるため、プロバイダーの中には、これを必要とするものもあります。
Unity プロジェクトのビルドプロセスでは、エンジン起動時に XRSDKPreInit()
を呼び出す前に、プロバイダーライブラリの名前が必要となります。これを行うには、 IXRLoaderPreInit.GetPreInitLibraryName
インターフェースを XRLoader
に実装します。
public string GetPreInitLibraryName(BuildTarget buildTarget, BuildTargetGroup buildTargetGroup)
{
return "XRSDKMyProviderLibraryName";
}
Unity が起動するときに、上のコードを実行してライブラリをロードします。次に、Unity はそのライブラリを開き、XRSDKPreInit
のエクスポートを探して、それを呼び出します。この時、XRSDKPreInit
は UnityXRPreInitProvider
を登録する必要があります。
以下は、エンジンの初期化に使用するすべてのコールバックを登録する簡単な例です。
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 ビットのビットフィールドのフラグを返します。現在、以下のフラグが公開されています。
kUnityXRPreInitFlagsEGLUsePBuffer
- EGL プラットフォーム (Android、スタンドアロンの Oculus デバイスなど) では、EGL は PBuffer を使って初期化する必要があります。kUnityXRPreInitFlagsEGLUseNoErrorContext
- EGL プラットフォームでは、EGL を NO_ERROR コンテキストで初期化する必要があります。プロバイダーは、未定義のビットを設定すべきではありません。これは、将来の拡張に使用される可能性があるからです。
GetGraphicsAdapterId
は、Unity のランタイムグラフィックスデバイスがグラフィックス API の初期化に使用するグラフィックスアダプターを設定します。例えば、ユーザーがユーザーの主要ディスプレイデバイスとは別の GPU にヘッドセットを接続すると、Unity はその補助的 GPU を明示的にターゲットとするグラフィックス API を初期化する必要があるかもしれません。
GetVulkanDeviceExtensions
と GetVulkanInstanceExtensions
は、プロバイダーが Unity でデバイスとインスタンスの特定の拡張機能とともに Vulkan を初期化する必要がある場合に使用されます。これはコンポジターのサーフェス共有によく使われます。どちらもスペースで区切られた拡張機能の文字列を返します。
GetPreInitLibraryName
は、XRManager プレハブの最初の XRLoader でのみ呼び出されます。そのため、ランタイムに PreInit エントリーポイントを提供できるのは、リスト内の最初のプロバイダーのみです。