|
除了基本的脚本接口,本机代码的插件团结可以接受某些事件发生时的回调。这主要是用来在你的插件实现底层渲染并使其与统一的多线程渲染工作。
通过统一接口定义暴露头设有编辑。
界面注册
一个插件应该出口unitypluginload和unitypluginunload统一处理主要事件。看到iunityinterface。Hfor the正确签名。iunityinterfaces提供给插件访问进一步统一的API。
#include "IUnityInterface.h"
#include "IUnityGraphics.h"
// Unity plugin load event
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
IUnityGraphics* graphics = unityInterfaces->Get<IUnityGraphics>();
}
访问图形设备
插件可以使用通用的图形设备的功能得到iunitygraphics接口。在较早的版本的Unity有unitysetgraphicsdevice函数用于出口以接收通知的图形设备事件。从统一5.2新iunitygraphics接口(发现iunitygraphics。H)提供了一种方法来登记一个回调。
#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
break;
}
case kUnityGfxDeviceEventShutdown:
{
s_RendererType = kUnityGfxRendererNull;
//TODO: user shutdown code
break;
}
case kUnityGfxDeviceEventBeforeReset:
{
//TODO: user Direct3D 9 code
break;
}
case kUnityGfxDeviceEventAfterReset:
{
//TODO: user Direct3D 9 code
break;
}
};
}
插件的渲染线程回调
绘制在统一的平台,可以多线程如果一些可用的CPU将允许它。当多线程渲染时,渲染API命令,发生在一个线程从一个运行MonoBehaviour脚本完全分开。因此,它不可能为你的插件立即开始执行渲染的,因为可能会妨碍任何渲染线程的时间做。
为了做任何渲染插件,你应该打电话gl.issuepluginevent从你的脚本。这将导致提供的原生功能是从渲染线程调用。例如,如果你调用从相机OnPostRender函数gl.issuepluginevent,你相机渲染完成后立即回调到插件。
签名的unityrenderingevent回调提供iunitygraphics。H 本地插件的代码:
/ /插件函数来处理一个特定的渲染事件
静态unity_interface_api onrenderevent(int eventid)
{
// TODO:用户绘制的代码
}
/自由定义功能通过一个回调函数插件脚本
extern“C”的具体unityrenderingevent unity_interface_export unity_interface_api
getrendereventfunc()
{
返回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);
这样的回调,现在也可以通过添加commandbufferscommandbuffer.issuepluginevent。
例子
一个渲染插件实例可以在这里下载。这说明两件事:
渲染一个三角形的旋转从C代码毕竟定期进行渲染。
填补了从C代码的一个程序上的纹理,使用texture.getnativetextureptr访问它。
工程项目:
Windows(Visual Studio 2013)和Mac OS X(Xcode 3.2)使用Direct3D 9,Direct3D 11和OpenGL,Direct3D 12根据平台。Direct3D 9部分代码还演示了如何处理“丢失”的设备。
Windows应用商店的应用程序(见renderingplugin \ wsavisualstudio2013的更多信息)
|
|