此接口允许您在创建图形设备之前对其进行配置。常见用例包括在多 GPU 场景中选择特定 GPU、启用图形扩展以及修改缓冲区创建。
您的提供程序可以导出原生符号XRSDKPreInit
,该符号在运行时初始化的早期(在创建图形设备之前)被调用。它应该使用相关的入口点填充UnityXRPreInitProvider
结构,以便在早期初始化期间向引擎提供可能需要的信息。某些提供程序需要这样做,因为图形设备是在提供程序能够初始化之前创建的。
Unity 项目构建过程需要您的提供程序库的名称,然后才能在引擎启动时调用XRSDKPreInit()
。为此,在您的XRLoader
上实现IXRLoaderPreInit.GetPreInitLibraryName
接口。
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、独立 Meta/Oculus 设备等)上,EGL 应使用 PBuffer 初始化。kUnityXRPreInitFlagsEGLUseNoErrorContext
- 在 EGL 平台上,EGL 应使用 NO_ERROR 上下文初始化。提供程序不应设置任何未定义的位,因为它们可能用于将来的扩展。
GetGraphicsAdapterId
设置 Unity 运行时图形设备用于图形 API 初始化的图形适配器。例如,如果用户将耳机插入与用户主显示设备不同的 GPU,则 Unity 可能需要初始化显式针对辅助 GPU 的图形 API。
如果提供程序需要 Unity 使用设备和实例的特定扩展初始化 Vulkan,则使用GetVulkanDeviceExtensions
和GetVulkanInstanceExtensions
。这通常用于合成器表面共享。这两个函数都返回一个以空格分隔的扩展字符串。