Version: 2021.3
言語: 日本語
XR SDK メッシュ化サブシステム
XR SDK Stats インターフェース

XR SDK PreInit インターフェース

このインターフェースでは、グラフィックスデバイスが作成される前にその設定を行うことができます。一般的な使用例としては、マルチ GPU シナリオでの特定の GPU の選択、グラフィックス拡張の有効化、バッファ作成の変更などがあります。

概要

プロバイダーは、ネイティブのシンボル XRSDKPreInit をエクスポートすることができます。このシンボルは、ランタイム初期化の早い段階、つまりグラフィックスデバイスの作成前に呼び出されます。プロバイダーは、UnityXRPreInitProvider 構造体に、初期化中に必要な情報をエンジンに提供するための関連エントリーポイントを記入する必要があります。プロバイダーが初期化できるようになる前にグラフィックデバイスが作成されるため、プロバイダーの中には、これを必要とするものもあります。

探索

Unity プロジェクトのビルドプロセスでは、エンジン起動時に XRSDKPreInit() を呼び出す前に、プロバイダーライブラリの名前が必要となります。これを行うには、 IXRLoaderPreInit.GetPreInitLibraryName インターフェースを XRLoader に実装します。

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

Unity が起動するときに、上のコードを実行してライブラリをロードします。次に、Unity はそのライブラリを開き、XRSDKPreInit のエクスポートを探して、それを呼び出します。この時、XRSDKPreInitUnityXRPreInitProvider を登録する必要があります。

XRSDKPreInit での登録

以下は、エンジンの初期化に使用するすべてのコールバックを登録する簡単な例です。

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

GetPreInitFlags は、64 ビットのビットフィールドのフラグを返します。現在、以下のフラグが公開されています。

  • kUnityXRPreInitFlagsEGLUsePBuffer - EGL プラットフォーム (Android、スタンドアロンの Oculus デバイスなど) では、EGL は PBuffer を使って初期化する必要があります。
  • kUnityXRPreInitFlagsEGLUseNoErrorContext - EGL プラットフォームでは、EGL を NO_ERROR コンテキストで初期化する必要があります。

プロバイダーは、未定義のビットを設定すべきではありません。これは、将来の拡張に使用される可能性があるからです。

GetGraphicsAdapterId

GetGraphicsAdapterId は、Unity のランタイムグラフィックスデバイスがグラフィックス API の初期化に使用するグラフィックスアダプターを設定します。例えば、ユーザーがユーザーの主要ディスプレイデバイスとは別の GPU にヘッドセットを接続すると、Unity はその補助的 GPU を明示的にターゲットとするグラフィックス API を初期化する必要があるかもしれません。

GetVulkanDeviceExtensions と GetVulkanInstanceExtensions

GetVulkanDeviceExtensionsGetVulkanInstanceExtensions は、プロバイダーが Unity でデバイスとインスタンスの特定の拡張機能とともに Vulkan を初期化する必要がある場合に使用されます。これはコンポジターのサーフェス共有によく使われます。どちらもスペースで区切られた拡張機能の文字列を返します。


既知の問題点

  • 現在、GetPreInitLibraryName は、XRManager プレハブの最初の XRLoader でのみ呼び出されます。そのため、ランタイムに PreInit エントリーポイントを提供できるのは、リスト内の最初のプロバイダーのみです。
  • PreInit には、早期のエンジン初期化時にエントリーポイントを公開するためにネイティブのライブラリが必要です。
  • PreInit は今のところエディターには適用されません。
XR SDK メッシュ化サブシステム
XR SDK Stats インターフェース