Unity WebGL中的底层插件
我们曾经为大家分享过《WebGL平台内存详解》的内容。本文我们一起来看看Unity WebGL平台如何使用底层插件,如果您曾想过在网页中重用现有的C/C++代码,例如OpenGL ES实现的图形效果,请不要错过本文。我们从插件类型、实现插件、插件示例与演示几个方面进行阐述。
插件类型
Unity支持两种类型的插件:Managed托管插件和Native原生插件。对于托管插件来说,WebGL与其它平台支持托管插件的方式一致,唯一的区别在于插件的托管程序集与引擎及用户的托管代码会一起转换为JavaScript,这里指asm.js/wasm。
对于原生插件来说,针对网页来谈“原生”真的有意义么?如果原生特指例如Mac,Win 32/64等底层架构,当然没有意义。然而,Unity WebGL也支持几种其它类型的插件:JavaScript、C/C++以及预编译的LLVM字节码。
Unity用户手册中有几个WebGL平台下JavaScript和C语言插件的例子,并且演示了如何通过脚本与它们进行交互。既然可以使用C/C++源代码,那就可以访问底层插件接口用来渲染。Unity 5.5就可以通过新加的代码钩子,来注册底层插件。
如您所见,我们需要添加较多代码,下面来看看实现插件需要哪些步骤。
实现插件
首先,需要将Unity安装目录下Editor/Data/PluginAPI中的Plugin API头文件,复制到插件源文件所在的目录。
插件使用头文件IUnityInterface.h和IUnityGraphics.h来声明所需的接口。由于这些头文件适用于特定的Unity版本,所以保持与编辑器版本同步至关重要。注册插件需要调用函数UnityRegisterRenderingPlugin。
无论如何,首先需要实现加载和卸载的回调函数来获取IUnityGraphics接口,并注册或注销用于底层渲染的图形设备回调函数。示例如下:
实现了以上接口,就可以注册插件了。
最后,启动时需要添加C#绑定并注册插件,以保证UnityRegisterRenderingPlugin确实执行了。
然后需要实现OnGraphicsDeviceEvent并添加渲染代码。
注意,如果不同的平台使用相同的插件源文件,可以检查__EMSCRIPTEN__或UNITY_WEBGL (仅限Unity 5.6及以上版本)来条件编译代码。
最后,如果需要浏览系统头文件,如:gl2.h,可以在Unity安装目录下找到:
Editor/Data/PlaybackEngines/WebGLSupport/BuildTools/Emscripten/system/include
插件示例
如果有兴趣尝试制作渲染插件,Unity开源库Bitbucket上的NativeRenderingPlugin是一个非常棒的起点。它已经设置注册了所需的回调,编译了自己的着色器,并且演示了如何在简单的Unity场景中渲染一个三角面。
注意,在Unity WebGL中不需要单独建立C/C++插件。该示例中的Unity项目包含一个简单的文件(Plugins / WebGL / RenderingPlugin.cpp),其中包含了插件的具体实现,如下所示:
演示
如果在支持Unity WebGL的浏览器或者设备上浏览此页面,请查看下面的Demo,它展示了用OpenGL ES写的Mandelbrot分形效果,这是通过原生渲染插件调用的。
最初的OpenGL 2.0 Demo是用C++和GLSL写的,所以只需做一些修改,使其与前面的原生渲染插件Demo完美兼容。您可以点击【阅读原文】下载Demo的Unity项目及插件源代码。
总结
本文介绍了Unity WebGL中底层插件的实现办法。考虑到Unity WebGL平台的调试工具并不丰富,建议可以在不同的GLES2/3 API平台上制作原型,以保证WebGL平台一旦构建成功,也可以在iOS,Android或PC端正常运行。了解更多详情,请访问Unity官方中文社区(forum.china.unity3d.com)。
更多Unity技术文章
点击“阅读原文”访问Unity官方中文社区