Version: 6000.3
语言: 中文
原生插件 API 简介
用于着色器编译器的本机插件 API

用于图形和渲染的本机插件 API

使用IUnityGraphics接口给一个插件在 Unity 外部创建的一组代码,用于在 Unity 中创建功能。可以在 Unity 中使用两种插件:托管插件(使用 Visual Studio 等工具创建的托管 .NET 程序集)和本机插件(特定于平台的本机代码库)。详细信息
请参阅术语表
访问通用图形设备功能。该接口在IUnityGraphics.h头文件,位于 PluginAPI 文件夹中。

以下脚本使用IUnityGraphics接口来注册回调:

#include "IUnityInterface.h"
#include "IUnityGraphics.h"
    
static IUnityInterfaces* s_UnityInterfaces = NULL;
static IUnityGraphics* s_Graphics = NULL;
static UnityGfxRenderer s_RendererType = kUnityGfxRendererNull;
    
// Unity plugin load event
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
    UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
    s_UnityInterfaces = unityInterfaces;
    s_Graphics = unityInterfaces->Get<IUnityGraphics>();
        
    s_Graphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent);
        
    // Run OnGraphicsDeviceEvent(initialize) manually on plugin load
    // to not miss the event in case the graphics device is already initialized
    OnGraphicsDeviceEvent(kUnityGfxDeviceEventInitialize);
}
    
// Unity plugin unload event
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
    UnityPluginUnload()
{
    s_Graphics->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent);
}
    
static void UNITY_INTERFACE_API
    OnGraphicsDeviceEvent(UnityGfxDeviceEventType eventType)
{
    switch (eventType)
    {
        case kUnityGfxDeviceEventInitialize:
        {
            s_RendererType = s_Graphics->GetRenderer();
            //TODO: user initialization code on graphics device initialization. 
            For example, D3D11 resource creation.
            break;
        }
        case kUnityGfxDeviceEventShutdown:
        {
            s_RendererType = kUnityGfxRendererNull;
            //TODO: user graphics API code to call on graphics device shutdown.
            break;
        }
        case kUnityGfxDeviceEventBeforeReset:
        {
            //TODO: user graphics API code to call before graphics device reset.
            break;
        }
        case kUnityGfxDeviceEventAfterReset:
        {
            //TODO: user graphics API code to call after graphics device reset.
            break;
        }
    };
}

渲染线程上的插件回调

如果平台和可用 CPU 数量允许,您可以使用多线程在 Unity 中进行渲染。

注意:使用多线程渲染时,渲染 API 命令会在与 MonoBehaviour 不同的线程上运行脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间修改组件属性以及以您喜欢的任何方式响应用户输入。更多信息
请参阅术语表
.主线程和渲染线程之间的通信意味着您的插件可能不会立即开始渲染,具体取决于主线程已推送到渲染线程的工作量。

要从插件渲染,请调用GL.IssuePluginEvent从您的托管插件 使用 Visual Studio 等工具创建的托管 .NET 程序集,用于 Unity 中。更多信息
请参阅术语表
脚本。这会导致 Unity 的呈现管道从呈现线程调用本机函数,如以下代码示例所示。例如,如果您调用GL.IssuePluginEvent相机在场景中创建特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。更多信息
请参阅术语表
OnPostRender函数,该函数在相机完成渲染后立即调用插件回调。

以下示例显示了本机插件Unity 外部创建的用于 Unity 的特定于平台的本机代码库。允许您访问 OS 调用和第三方代码库等功能,否则这些功能将无法用于 Unity。更多信息
请参阅术语表
法典:

// Plugin function to handle a specific rendering event
static void UNITY_INTERFACE_API OnRenderEvent(int eventID)
{
    // User rendering code
}
    
// Freely defined function to pass a callback to plugin-specific scripts
extern "C" UnityRenderingEvent UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
    GetRenderEventFunc()
{
    return OnRenderEvent;
}

以下示例显示了相应的托管代码:

#if UNITY_IPHONE && !UNITY_EDITOR
[DllImport ("__Internal")]
#else
[DllImport("RenderingPlugin")]
#endif
private static extern IntPtr GetRenderEventFunc();
    
// Queue a specific callback to be called on the render thread
GL.IssuePluginEvent(GetRenderEventFunc(), 1);

的签名UnityRenderingEvent回调在IUnityGraphics.h原生渲染插件示例中。

使用 OpenGL 图形 API 的插件

有两种类型的 OpenGL 对象:

  • 跨 OpenGL 上下文共享的对象,例如纹理、缓冲区、渲染缓冲区、采样器、查询、着色器在 GPU 上运行的程序。更多信息
    请参阅术语表
    和程序对象。
  • 每个 OpenGL 上下文对象,例如顶点数组、帧缓冲区、程序管道、转换反馈和同步对象。

Unity 使用多个 OpenGL 上下文。在初始化和关闭编辑器和播放器时,Unity 依赖于主上下文,但在渲染时它使用专用上下文。也就是说,您无法在kUnityGfxDeviceEventInitializekUnityGfxDeviceEventShutdown事件。

渲染扩展 API

Unity 还支持低级渲染扩展,可以在某些事件发生时接收回调。这主要用于在插件中实现和控制低级渲染,并使其能够与 Unity 的多线程渲染配合使用。

由于此扩展的低级性质,可能需要在创建设备之前预加载插件。目前,该约定是基于名称的;插件名称必须以GfxPlugin例如:GfxPluginMyNativePlugin.

Unity 公开的渲染扩展定义位于文件中IUnityRenderingExtensions.h,位于 PluginAPI 文件夹中。

所有支持本机插件的平台都支持这些扩展。

若要利用渲染扩展,应导出插件UnityRenderingExtEvent和可选的UnityRenderingExtQuery.有关更多信息,请参阅头文件中提供的文档。

渲染线程上的插件回调

插件通过UnityRenderingExtEvent每当 Unity 触发其中一个内置事件时。回调也可以通过以下方式添加到 CommandBuffersCommandBuffer.IssuePluginEventAndDataCommandBuffer.IssuePluginCustomBlit从脚本。

其他资源

原生插件 API 简介
用于着色器编译器的本机插件 API