UE4使用nDisplay渲染到多个显示设备(一)

UE4使用nDisplay渲染到多个显示设备(一)

文档链接

交互式内容不局限于显示在一个屏幕上,甚至不局限于一个像VR头盔一样的双屏幕设备。越来越多的可视化系统旨在通过多个同时显示的实时内容来更有效地让观众沉浸在游戏环境中。这些系统可能由多个相邻的物理屏幕组成,例如Powerwall显示器;或者他们可能使用多个投影仪将3D环境投射到物理表面,如穹顶、倾斜的墙壁或弯曲的屏幕,如在洞穴虚拟环境中。

虚幻引擎通过一个名为nDisplay的系统支持这些使用场景。该系统解决了同时将3D内容呈现给多个显示器的一些最重要的挑战:

  • 它简化了跨网络中的不同计算机部署和启动项目的多个实例的过程,每个实例都呈现给一个或多个显示设备。
  • 它根据显示硬件的空间布局,管理在每一帧中为每个屏幕计算查看截锥体所涉及的所有计算。
  • 它确保在各种屏幕上显示的内容保持完全同步,在引擎的所有实例中都具有确定性的内容。
  • 它提供了被动和主动的立体渲染。
  • 它可以由VR跟踪系统的输入驱动,这样显示器中的视点就可以准确地跟随真实生活中移动的观众的视点。
  • 它足够灵活,可以支持任何相对方向的任意数量的屏幕,并且可以跨任意数量的项目轻松地重用它。

nDisplay 概览

描述在nDisplay渲染网络中多台计算机如何一起工作。

每个nDisplay设置都有一个主计算机,以及任意数量的其他计算机。

  • 网络中的每台计算机运行一个或多个项目打包的可执行文件实例。
  • 每个虚幻引擎实例处理渲染到一个或多个显示设备,如屏幕或投影仪。
  • 对于每个设备,一个虚幻引擎的实例处理,它呈现一个单一的观点在同一3D场景。通过设置这些视点,使它们在3D世界中的位置与真实世界中屏幕或投影表面的物理位置相匹配,您可以给观众一种在虚拟世界中存在的错觉。
  • 主节点还负责通过与虚拟现实外围网络(vrpn)的连接接收来自空间跟踪器和控制器的输入,并将这些输入复制到所有其他连接的计算机。

在这里插入图片描述

上图显示了一个可能的nDisplay网络。像所有的nDisplay网络一样,它的一台pc充当主节点。此主节点接受来自VRPN服务器的系统输入,VRPN服务器中继来自空间跟踪设备和其他控制器设备的信号。该网络还包含其他几台pc,它们运行虚幻引擎项目的其他实例。每个集群节点驱动一个或多个显示投影仪。


一个应用程序实例,呈现给一个显示设备
这是为nDisplay设置主机的最直接的方法。对于您需要的每个投影仪或显示设备,您需要设置一台计算机来处理该设备的呈现。在那台计算机上,运行虚幻引擎的一个实例。通常,在此场景中,您将设置该应用程序实例,以将单个3D空间矩形呈现到单个视图中。


多个应用程序实例,每个实例呈现给一个显示设备
如果您的网络中有多台计算机,它们有多个显卡,可以驱动多个显示设备,那么您可以在这些计算机上运行虚幻引擎的多个实例。您将指导虚幻引擎的每个实例呈现不同的3D空间矩形,并将每个实例分派到不同的图形卡。
如果项目的CPU和内存需求足够小,可以在同一台计算机上运行多个实例,则此方法可以很好地工作。


一个应用程序实例渲染到多个显示设备
使用此选项,您可以在计算机上运行虚幻引擎应用程序的单个实例,但是您可以将其设置为在一个大窗口内将场景3D空间的多个独立矩形呈现到不同的区域。然后使用NVIDIA Mosaic或NVIDIA Surround等技术来分割单个大窗口,并在不同的显示设备上呈现每个单独的区域。
在这种情况下,将nDisplay与Mosaic或Surround一起使用的好处是,您可以呈现与不同监视器的物理布局精确匹配的视图,即使这些监视器不在同一平面上。但是,所有的视图都是由同一个虚幻引擎实例渲染的,所以你不能在同一台电脑上安装多个显卡。


nDisplay 组件

nDisplay为通常的虚幻系统架构添加了几个组件:

  • 在虚幻引擎内部工作的插件。它在组成集群的所有应用程序实例之间通信和同步信息,确保所有实例同时呈现相同的帧,确保每个显示设备呈现正确的游戏世界截屏,等等。
  • 一个网络供应和管理应用程序,叫做nDisplayLauncher。您在网络中的一台计算机上运行这个应用程序,以便在网络中的所有计算机上自动启动和退出打包的虚幻引擎应用程序。
  • 一个独立的监听程序,叫做nDisplayListener,在每台计算机上运行。此应用程序侦听来自nDisplayLauncher的传入请求,并在本地计算机上处理这些请求。
  • 一个包含nDisplay所需的所有设置的共享配置文件,在正确的计算机上启动正确数量的实例,每个实例在游戏的3D世界中呈现正确的视图,从而在所有的屏幕或投影仪上产生无缝呈现的假象。参见nDisplay配置文件参考。

Buleprint API

你可以在你的游戏运行时逻辑中使用蓝图api来控制nDisplay系统的行为。

系统公开了下面的API:

  1. 对于大多数与集群管理、查询输入设备、nDisplay呈现等相关的nDisplay Blueprint功能,在您的Blueprint中创建一个新的N Display > Get DisplayCluster模块API节点。
    对于在VRPN输入设备和虚幻引擎输入事件之间设置绑定和反射的函数,在您的蓝图中创建一个新的N Display > Get DisplayClusterInput模块API节点。请参阅将设备通道绑定到UE4输入

  2. 从节点的Out API pin中拖出,查看显示集群或显示集群输入类别:
    在这里插入图片描述

扩展 nDisplay

nDisplay提供了许多开箱即用的特性,用于跨多台计算机和输出设备控制实时、同步的渲染。然而,有各种各样的投影系统和显示表面,您可能需要扩展nDisplay渲染系统来支持您自己的技术选择。如果您熟悉c++编程,并且了解nDisplay在典型用例中的工作方式,那么可以在可扩展的呈现API之上构建nDisplay,从而扩展nDisplay以支持其他显示和校准技术。

nDisplay API将渲染管道分解成几个主要概念:

  • DisplayClusterRenderingDevice,它本质上是本地IStereoRendering接口的扩展。
  • DisplayClusterPostProcess是一组6个回调,您可以使用它们将后期处理应用到特定的视图端口。
  • DisplayClusterProjectionPolicy负责自定义投影方法,例如支持可伸缩的显示或MPCDI来渲染到曲面,或执行简单的平面投影。
  • DisplayClusterRenderSyncPolicy用于各种同步方法,如nvSwapLock、vSync或用于24hz显示的自定义跳帧同步。

通过上面的描述,你可以创建自己的专用的功能。您可以自定义生成的图像nDisplay系统适合任何或投影显示技术,同时让所有的nDisplay集群系统都受益,而无需修改已发行的虚幻引擎源代码。

有关如何设置这些元素的实现的工作模型,请参阅PicpProjection和PicpMPCDI模块的源代码。你可以在虚幻引擎源代码的Engine/Plugins/Runtime/nDisplay/Source中找到这些模块。

发表评论

电子邮件地址不会被公开。 必填项已用*标注