沈剑锋, 姜忠鼎
(复旦大学 上海市数据科学重点实验室, 上海 201203)
基于游戏引擎的柱面主动立体多投影显示系统
沈剑锋, 姜忠鼎
(复旦大学 上海市数据科学重点实验室, 上海 201203)
为了使面向柱面的主动立体多投影显示系统能够覆盖用户更多的视野空间,营造强烈的沉浸感,为人们带来震撼的视觉体验。游戏引擎是互动图形应用的集成化开发工具,能够提高多投影显示系统的开发效率,降低系统复杂度。然而,现有基于游戏引擎只支持主动立体显示的图形系统中间件,不支持柱面多投影显示系统。因此,基于游戏引擎,整合了多投影校正技术、柱面全方位立体影像生成技术以及主动立体显示技术,设计并实现了面向柱面的主动立体多投影显示系统。实验结果表明,该系统具有良好的显示效果。
柱面显示; 立体成像; 多投影校正; 游戏引擎
随着图形技术和显示技术的快速发展,人们对显示系统要求越来越高。多投影显示系统以其尺寸大、分辨率高、支持多人同时观看等特点,在教育、娱乐、仿真、虚拟现实以及数据可视化等领域有着越来越广泛的应用。多投影显示系统的显示表面可能有多种形状,其中面向柱面的多投影显示系统能够覆盖用户更多的视野空间,结合柱面立体影像生成技术和主动立体显示技术为用户提供强烈的沉浸感。
游戏引擎是互动图形应用的集成化开发工具,提供了高性能的基础系统、丰富的功能和高效的开发流程。基于游戏引擎开发多投影显示系统,能够提高开发效率,简化系统复杂度。Unity[1]和Unreal[2]是目前主流的商业游戏引擎,功能强大,且具有很好的扩展性。
基于游戏引擎开发面向柱面的主动立体多投影显示系统具有重要意义,开发此类系统涉及的技术点包括多投影校正技术,立体影像生成技术和主动立体显示技术等。然而,现有基于游戏引擎且支持主动立体显示的图形系统中间件不支持柱面显示表面。MiddleVR for Unity[3]是基于Unity引擎的图形系统中间件,提供简单易用的接口帮助开发者进行虚拟现实应用的创作。MiddleVR能够生成平面立体影像并进行主动立体显示。然而,MiddleVR不支持带有重叠区的多投影拼接融合,因而无法直接运行在柱面多投影系统中。MiddleVR可以借助桌面融合技术在柱面多投影系统中运行,但必须依赖于专业显卡。此外,MiddleVR不能生成柱面全方位立体影像,应用范围有限。CaveUDK[4]是针对Unreal游戏引擎的虚拟现实框架,支持用户头部跟踪和多种交互设备,但仅用于开发CAVE系统。本文基于Unity游戏引擎,整合了柱面多投影校正技术、柱面全方位立体影像生成技术和主动立体显示技术,设计实现了面向柱面的主动立体多投影显示系统,并通过实验验证了系统的显示效果。相比MiddleVR,本文系统支持带有重叠区的柱面多投影校正,不依赖专业显卡和桌面融合技术,能够生成柱面全方位立体影像,同时提供主动立体和红蓝立体输出,便于调试。
基于游戏引擎的柱面主动立体多投影显示系统整体架构如图1所示。
图1 基于游戏引擎的柱面主动立体多投影显示系统架构
本系统主要分为两个子系统,分别是柱面多投影校正系统和面向柱面显示表面的三维图形应用。
柱面多投影校正系统:柱面投影校正系统在离线阶段进行柱面多投影校正,使所有投影机的输出画面对齐,且重叠区过渡平滑,所有投影画面共同显示一幅完整的柱面影像。系统以文件形式输出投影校正数据。本文使用文献[5]中基于交互式网格编辑的多投影校正技术。
面向柱面显示表面的三维图形应用:面向柱面显示表面的三维图形应用是柱面多投影显示系统中实时运行的程序,基于Unity引擎开发,主要包含如下5个部分:
1) 虚拟场景:虚拟场景是系统的基本组成部分,虚拟场景内容根据应用的具体需求进行开发。本文系统的虚拟场景是一个射击类游戏场景。
2) 集群同步模块:集群同步模块负责在多个节点之间逐帧同步虚拟场景中的游戏对象和UI,并确保各节点同步刷新画面。本文直接使用文献[6-8]中基于Master-Slave架构的集群同步技术。
3) 柱面立体影像生成模块:该模块使用基于多视点的全方位柱面立体影像生成方法[9-10]为虚拟场景实时生成柱面立体影像。
4) 几何与颜色校正模块:该模块负责在程序启动时读取投影校正数据,并在运行时根据投影校正数据对生成好的柱面立体影像进行几何与颜色校正。
5) 主动立体显示插件:该插件以主动立体的方式将校正后的画面输出到每台投影机,并通过硬件同步技术解决集群中多节点之间左右眼画面不同步的问题。
下文中,我们介绍多投影校正系统,柱面立体影像生成模块以及主动立体显示插件。
本文采用基于交互式网格编辑的多投影校正方法。该方法为每台投影机创建一张变形网格,通过手工编辑的方式使各个投影机的网格对齐后均匀分布在投影幕上,如图 2所示。
图2 投影几何校正示意图
接着,根据网格重叠关系计算投影画面的亮度衰减,使画面重叠区平滑过渡。系统最终为每台投影机生成一张变形网格和一张用于保存亮度衰减值的Alpha贴图。面向柱面显示表面的三维图形应用在启动时读取这些校正数据,并在运行中实时对柱面立体影像进行校正输出,如图 3所示。
图3 程序内几何与颜色校正示意图
人们在观察柱面时,需要通过不断旋转观察角度来观察柱面的不同区域。Peleg等人提出的多视点全方位立体影像生成方法模拟了这一过程,令立体相机在柱面中央进行多次旋转,从不同的视点分别拍摄不同的柱面区域,并将生成的一系列平面立体影像拼接为柱面立体影像。
本文基于上述方法,在三维立体应用中为虚拟场景生成柱面立体影像。我们依据柱面投影幕的形状大小,在虚拟场景中生成一个柱面成像表面。接着,将柱面剖分为若干片段,针对每个柱面片段在拍摄环上生成一对左右眼透视相机,如图 4所示。
图4 柱面剖分及立体相机示意图
120度柱面被剖分为8个片段,从拍摄环出发的实线和虚线分别表示左眼相机和右眼相机的水平视域。
柱面立体影像实际为一张左眼柱面影像和一张右眼柱面影像。生成左右眼柱面影像时,我们首先将所有左右眼相机捕捉的矩形画面直接拼接为左右眼原始影像,然后通过柱面重映射的方法,找到左右眼柱面影像每个像素点在左右眼原始影像中对应的纹理坐标,采样出颜色,并填充到左右眼柱面影像中,如图 5所示。
图5 全方位柱面立体影像生成过程示意图
上述映射关系可以用查找表(Lookup Table)来保存,查找表本质为一张纹理,大小和左右眼柱面影像相同,二者像素点一一对应。查找表的每个像素保存的不是颜色信息,而是左右眼柱面影像中每个像素在左右眼原始影像中对应的纹理坐标。这种映射关系在运行时保持不变,因此我们可以在初始化阶段预计算得到查找表,并在运行时根据查找表快速生成柱面立体影像。
由于相机使用斜投影方式且相邻相机的位置存在差异,上述方法生成的左右眼柱面影像在柱面剖分位置会存在折痕。对此,我们在剖分柱面时令相邻相机的水平视域产生重叠,如图 6所示。
图6 带重叠区的柱面剖分及立体相机示意图
接着,在柱面重映射过程中,对于重叠区内的点,我们从重叠区对应的两个相机拍摄片段中采样出颜色进行融合,融合所需的权重值根据该点到重叠区两侧的距离进行计算,越靠近的片段权重值越高。这种使重叠区渐变过渡的方法能削弱甚至消除折痕。这里的权重值也可以在初始化阶段算好,并写入查找表。查找表使用4通道浮点数纹理,其中R和G通道保存纹理坐标,B通道保存权重值,A通道暂不使用。由于重叠区的存在,左眼和右眼柱面影像都需要两张查找表,查找表的使用方式,如图 7所示。
图7
为立体影像生成查找表的过程包含大量浮点数坐标计算,CPU算法耗时较长,会导致程序启动缓慢。本文系统基于可编程图形渲染管线,在着色器中进行柱面重映射和颜色权重计算,利用显卡的浮点计算能力和并行计算能力,大幅缩短了查找表的生成时间。
立体显示技术通过模拟人类左右眼视差产生立体感,常见的立体显示技术包括红蓝立体,偏振立体和主动立体等。红蓝立体显示会产生色差,影响观看体验。偏振立体使用两组投影机分别显示左右眼画面,需要特制的投影幕,成本较高。主动立体技术则能避免上述问题。
主动立体显示技术本身比较简单,只需在渲染阶段将左右眼画面分别渲染到左右眼后台缓冲区即可。然而,Unity引擎没有提供主动立体显示功能,由于引擎未开源,我们也无法修改其窗口管理和渲染系统的代码。因此,我们采用变通方法,利用插件技术实现主动立体显示。
主动立体显示技术通常使用OpenGL图形库中与QuadBuffer有关的函数,因此Unity程序需使用OpenGL内核。在应用初始化阶段,主动立体插件首先创建立体模式的OpenGL窗口,并通过wglShareLists函数得到Unity渲染系统的OpenGL上下文使用权限。接着,Unity程序会创建两张RenderTexture用于渲染每帧的左右眼画面,我们通过GetNativeTexturePtr函数获取RenderTexture在OpenGL系统中的纹理ID,并将该ID告知主动立体插件。在渲染阶段,主动立体插件通过纹理ID获取每帧的左右眼画面,将其渲染到立体窗口的后台缓冲区,最后通过wglSwapLayerBuffers函数输出画面。这样,我们就借用插件创建的窗口输出了主动立体游戏画面,整体流程如图 8所示。
为了便于调试,我们还可以通过配置文件让插件输出红蓝立体画面。
由于集群系统存在网络延迟和硬件差异,单纯的软件同步技术无法保证所有节点交换前后台换缓冲区的时间严格一致,此外,各个节点显卡自动切换左右眼画面的时间也存在差异,这些问题可以用硬件同步技术来解决。硬件方面,我们为集群中每个节点安装一块硬件同步卡,同步卡与显卡相连,不同节点的同步卡使用RJ45网线串联。软件方面,我们只需在插件初始化阶段,以立体窗口的设备上下文为参数,调用OpenGL扩展库中的wglJoinSwapGroupNV和wglBindSwapBarrierNV函数,即可开启硬件同步。
图8 通过插件在Unity引擎中实现主动立体显示的流程图
4.1 实验环境
本文实验环境,如图 9所示。
图9 实验测试环境示意图
主机A与主机B接入同一局域网,主机A连接两台投影机,主机B连接一台投影机。3台投影机投射在半径4米,高2.6米,120度张角的柱面投影幕上。
系统硬件配置如下:主机A配备Intel Core i7-4970处理器,16GB内存。主机B配备Intel Core i5-2320处理器,8GB内存。主机A和主机B均配备了NVIDIA Quadro K4200显卡和Quadro Sync同步卡。3台投影机均为丽讯标清投影机,支持主动立体显示。网络环境为百兆局域网。系统的开发和运行环境为Microsoft Windows 7-64bit操作系统,Unity 5.4.5以及Microsoft Visual Studio 2015。
4.2 实验结果
本节从柱面多投影校正系统,柱面立体影像生成模块,主动立体显示插件三方面进行实验。
(1) 柱面多投影校正系统
本文使用交互式网格编辑的方式对柱面多投影系统进行校正,几何与颜色校正前后的投影网格,以及图片显示效果,如图 10所示。
(a)几何校正前的投影网格(b)几何校正后的投影网格
(c)几何与颜色校正前的图片显示效果(d)几何与颜色校正后的图片显示效果
图10 几何与颜色校前后效果对比
(2) 柱面立体影像生成模块
我们在系统中使用120度的柱面成像表面,剖分为8个片段,片段重叠角为5度。左右眼相机拼接出的原始影像,图 11所示。左右眼相机使用的查找表,如图 12所示。根据查找表生成的左右眼柱面影像,如图 13所示。合成出的柱面红蓝立体影像,如图 14所示。
我们实现了柱面立体影像查找表(Lookup Table)生成方法的CPU算法和GPU算法,并通过实验对比二者的性能。我们统计了两种算法在不同分辨率下的平均耗时。结果如图 15所示。
(a) 所有左眼相机拼接成的原始影像
(b) 所有右眼相机拼接成的原始影像
图11 左右眼相机拼接成的原始影像
图12 左右眼柱面影像的查找表
(a) 左眼柱面影像
图13 根据查找表生成的柱面影像
图14 左右眼柱面影像合成出的柱面红蓝立体影像
图15 柱面立体影像的查找表(Lookup Table)生成算法性能对比
CPU算法的耗时与查找表分辨率正相关,耗时较长。而GPU算法的耗时始终保持在3~4毫秒,性能明显优于CPU算法。
(3) 主动立体显示与硬件同步
为了验证主动立体显示效果和硬件同步效果,我们在分别在场景左眼画面的上半部分和右眼画面的下半部分显示出当前帧的帧号,然后用相机抓拍程序运行时画面。开启硬件同步后,1/30秒的低速快门拍摄的游戏画面,可以看到相机捕捉到了左右眼叠加的主动立体画面(两行帧号),如图 16所示。
图16 开启硬件同步后,1/30秒低速快门拍到的画面
关闭硬件同步后,使用1/125秒的高速快门拍摄的两幅游戏画面。如图 17所示。可以看到左侧和中部画面的帧号与右侧画面的帧号错位,说明左右眼画面不一致。开启硬件同步后,使用1/125秒的高速快门拍摄的游戏画面,可以看到系统在同一时刻显示的左右眼画面保持一致,如图 18所示。
4.3 系统运行效果
在柱面多投影系统中运行主动立体应用的最终效果,如图 19所示。
本文基于Unity游戏引擎,整合了多投影校正技术、柱面全方位立体影像生成技术、面向游戏引擎的主动立体显示技术,设计实现了面向柱面的主动立体多投影显示系统。实验结果表明,系统具有良好的柱面立体影像生成效果和主动立体显示效果,硬件同步技术则保证了立体画面的严格一致性。未来系统将整合基于相机反馈的柱面投影校正技术,提升投影校正的效率和准确性,并在更大规模的集群中进行测试。
[1] Unity Game Engine [EB/OL]. [2017-04-16]. http://www.unity3d.com/
[2] Unreal Engine 4[EB/OL]. [2017-04-16]. https://www.unrealengine.com/what-is-unreal-engine-4.
[3] MiddleVR for Unity[EB/OL]. [2017-04-16]. http://www.middlevr.com/middlevr-for-unity/
[4] Lugrin J, Charles F, Cavazza M. CaveUDK: a VR game engine middleware[J]. Virtual Reality Software and Technology, 2012.
[5] 陆明, 陈恒, 姜忠鼎. 面向矩形融合区校正的多投影显示系统的设计与实现[J]. 微型电脑应用, 2015(11):1-4.
[6] 罗璇, 冯一洲, 姜忠鼎. 一种面向网络游戏的沉浸式显示框架[J]. 计算机应用与软件, 2011, 28(12):1-4.
[7] 谢文斌. 基于游戏引擎的沉浸式立体显示游戏框架设计与实现[D]. 上海:复旦大学, 2013.
[8] 宋辉,姜忠鼎. 基于游戏引擎的图形用户界面集群渲染系统设计与实现[J]. 微型电脑应用, 2016(10):5-9
[9] Peleg S, Ben-Ezra M. Stereo Panorama with a single camera [A]. In: Proceedings of IEEE Computer Society Conference on Computer Vision and Pattern Recognition [C]. USA:IEEE, 1999:395-401, vol.1.
[10] Peleg S, Ben-Ezra M, Pritch Y. Omnistereo: Panoramic stereo imaging [J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2001, 23 (3):279-290.
Cylindrical Multi-projector Active Stereo Display System Based on Game Engine
Shen Jianfeng, Jiang Zhongding
(Shanghai Key Laboratory of Data Science, Fudan University, Shanghai 201203, China)
Cylindrical multi-projector system can create strong sense of immersion. Development of this system based on game engine can greatly improve the efficiency and reduce the complexity. However, the existing game engine supports only middleware of active stereo display system, does not support multi-projector system for cylindrical surface. In this paper, we integrate the multi-projector correction technique, stereo image generation technique and active stereo display technique, design and implement a multi-projector active stereo display system for cylindrical surface based on game engine. Experiments show that the system has good display effect.
Cylindrical display; Stereoscopic imagine; Multi-projector correction; Game engine
国家自然科学基金项目(60803064)
沈剑锋(1991-),男,硕士研究生,研究方向:计算机图形学和虚拟现实。 姜忠鼎(1976-),男,副教授,研究方向:计算机图形学和虚拟现实。
1007-757X(2017)07-0001-06
TP313
A
2017.04.01)