【译】《极限竞速:地平线3》中使用HDR延时摄影制作的天空

发表于2017-09-07
评论2 3k浏览

Shoot for the Sky: The Ambitious HDR Time-Lapse Skies of 'Forza Horizon 3'

《极限竞速:地平线3》中使用HDR延时摄影制作的天空

GDC 2017Playground Games工作室的首席灯光美术师Jamie Wood介绍了在《极限竞速:地平线3》中使用HDR延时摄影制作天空素材的技术。

赛车游戏《极限竞速(Forza)》系列最早由Turn10工作室开发。位于英国的Playground工作室,制作了开放世界的《极限竞速:地平线(Forza: Horizon)》系列,我们到目前为止已经制作了3款游戏(《极限竞速:地平线1/2/3)。我今天将要介绍的是《极限竞速:地平线3》中的天空实现技术。我们使用很多摄影方面的技术来拍摄天空的高分辨率高动态范围(HDR)延时照片序列。我们使用延时摄影得到的结果来绘制天空,并将其作为地面的环境光照使用。

GDC上的很多分享是关于如何提高工作流的工作效率,如何节省开发时间与经费的。但是我分享的这个技术带来大量额外的工作,希望大家能在最后理解我们为什么使用这样一个技术。接下来大家可以看一下游戏的预告片,来了解一下我们的游戏。


《极限竞速:地平线3》在20169月发布。这次分享的幻灯片中的截图来自游戏Xbox one版本。我们同样发布了windows PC的版本。我今天的分享首先会介绍为什么我们会花费如此大的精力在天空上。接着关于摄影方面,我会介绍我们实际拍摄天空的过程,以及如何处理拍摄到的数据。在游戏侧,我会介绍我们如何实现天空的动画,以及如何利用我们天空数据的优势来进行环境光的光照。最后我会介绍我们去澳大利亚的拍摄游戏中天空的过程。


 

关于为什么使用这样一个方法来制作天空,我们有很多原因:首先我们是一个赛车游戏,整个游戏的主要画面就是车、公路和天空,天空基本上会占据整个屏幕的1/3-2/3。其实,作为一个开放世界的地平线类游戏,我们需要动态的时间和天气,所以我们需要更好的天空的表现。再次,天空包含的场景的光照信息。最后,一些玩法指定的特定时间/特殊天气的比赛需要特定的天空(译注:比如雨天的街道追逐比赛或者沙漠中正午的特技赛)。

  

让我们先看一下在《极限竞速:地平线2》中使用的天空盒绘制技术。我们使用了和很多有动态时间变化的开放世界游戏一样的技术。首先是一个基础色的天空模拟,在这个模拟中根据太阳的位置,并对光线的散射计算进行建模,来实现天空颜色的渐变,来的到天空的基本颜色。在这层基础色之上是云彩层(cloud set),这些云彩由多层信息共同组成,特定时间/形状的云彩由概念美术师(原画)倾向于使用云彩的形状,云彩上光线衰减的方式,光线在云彩中的反射等内容。对每一个云彩有128个动画曲线来控制,这些曲线控制环境光,大气雾等参数。

我们的云彩不会发生变化,一整天的云彩都是同一种形状,没有随着时间的动态变化。不过因为我们的美术同事很给力,我们还是用这种方法制作了一些比较好的效果。

在《极限竞速:地平线3》中我们不想只是对天空云彩的模拟,我们需要更加真实的天空与云彩。

我们之前的方式很难对云彩的形状进行模拟得到这种很重的大片的云彩。更不用说这种自然界真实的天空效果。

 

 

 

对于这种光照和一层层的云的结合到一起的效果,我们还没有看到有哪个游戏能够很好的模拟这一效果。

  

为什么不能直接播放一个天空的录像呢?这挺起来是一个简单的想法,但是这有很多问题。一小时的4K视频会占用一整张的蓝光碟的存储空间,那样的话我们没有空间来存储我们的游戏。我们是一个赛车游戏,在里面基本驾驶速度在200km/h上,我们的带宽与内存使用主要在场景的流式加载上,没有足够的带宽给视频。我们也不想做出在画质上的让步,比如压缩视频。静止图的序列帧也同样是不能接受的。我们也不是很想使用第三方的中间件,我们已经有了一个绘制天空的系统,也不想在开发中因为引入未知的中间件而给项目带来风险。

我们希望使用真实的天空,我们决定拍摄真实的天空,并将这真实的天空使用到我们的项目中。

  

我们在冬天走到英国的户外,享受到了一般游戏开发过程中少见的新鲜空气与阳光。在最开始,我们测试单独一个相机拍摄延时摄影的能力。之后我们制作了一个装置来拍摄天空。

 

在实际的拍摄中我们面临很多挑战。在延时摄影领域,日出日落的延时摄影是很困难的。因为日出日落过程中光照条件是变化的,需要在每一时刻做出正确的曝光设置,并需要一个后处理来得到连续的明暗渐变。我们需要在24小时连续的情况下拍摄天空的HDR图像。为了能够获得运动的云彩清晰的轮廓和天空的整体明暗,我们需要拍摄HDR的天空,为此使用了减光镜(ND Filter, Neutral Density Filter)来减少进入到镜头的光强,进而来平衡快门的速度与HDR的冲突(译注:白天阳光较强,如果不使用减光镜,容易照片过曝,无法清楚的拍摄到云彩的运动情况)。为了避免镜头光晕,我们需要选择合适的光圈。为了能够拍摄更大面积的天空,我们使用了多台照相机来同时拍摄。

 

我们用三个相机组成了我们的拍摄装置,并给其配备了移动电源。为了能够覆盖整个天空,相机我们选用的是安装15mm鱼眼镜头的佳能1DX相机。选择1DX的主要原因是它支持包围式曝光(译注:包围式曝光是相机的一种高级功能,能够以不同的曝光度来高速连续的拍摄物体),能够在30秒内以不同的曝光度来连续拍摄7张照片。另外一个原因是1DX有两个CF卡槽,能够实现不间断的拍摄。

 

在拍摄的过程中,我们需要一直看着相机(译注:不只是怕丢)。因为一天中光照环境是变化的,所以我们需要根据当前的光照环境来修改曝光度。前文提到的减光镜需要在夜晚摘掉,来提高晚上光线的通过率(不过为了能快速的完成更换过程,准备了两组镜头,而不是把滤镜拧掉)

我们的拍摄余下的部分就没那么有技术含量了。主要是连接到变压器的电池、相机的电源和除雾加热器。我们在雨天不进行拍摄,我们只想拍天空和云彩,还不想拍雨。

此外需要提到的是我们在制作方面的努力。当我们在想制作这个24小时的延时摄影计划时,遇到了一些困难。因为在我们工作室所在的英国,想找到一处安全的,360度无遮挡的,并且没有光污染的拍摄环境是困难的。

让我们总结一下拍摄部分的工作,找一处合适的拍摄位置和人员是一个大生产任务,从最开始的实验到摄影装置完全完成用了我们三个月的时间,在拍摄过程中产生了大量的数据需要我们在接下来的步骤中处理。

  

 

我们使用两个软件来处理数据,Lightroom来清理照片数据,Nuke来处理数据。因为Nuke的基于节点的结构能够方便处理照片,并按照需要准备游戏使用的数据格式。

一台相机一天拍摄中每30秒进行7个不同曝光度拍摄将产生两万张raw照片,容量大约是1.2T。在图中可以看到由黑到白渐变的一排排照片,每一排是30秒拍摄的一组照片,图中的量大概是一个相机半个小时的拍摄产生的照片量。我们要做的是将这些数据压缩到最终游戏光盘中小于2G的空间上,还有很远的路要走。

 

这是我们拍摄的一张照片。在照片的左下角,可以看到相机特意拍摄到了装置上的漫反射光照探针(译注:即灰色的圆球),我们将这个球的明暗作为拍摄时环境光照的一个参考。

Lightroom软件中我们将照片进行批处理, 根据镜头的参数来修正色差和晕影,修正减光镜的影响,将光照统一到同一状况下。并且在Lightroom中修掉一些拍摄的瑕疵,比如落在镜头上的尘土。

接着我们的工作在nuke中进行。我们将每个摄像机拍摄的清理之后的7张序列曝光照片合并成一张HDR照片,将拍摄时扭曲修正。之后将3个相机的纹理合并到一张常用的latlong天空盒纹理。并且将照片上的星星的移除掉,因为我们发现当缩放这个云彩的纹理时,这些像素的星星也会被拉伸,这是我们不希望看到的。我们有专门的star field来完成星空的绘制。

我们同样创建了一个cloud mask来在纹理中标出来云彩的区域。我们在nuke中完成光照探针的计算。

 

我们在数据处理是有一个小技巧,对赛车类游戏比较有用的技巧,我们将天空盒纹理在垂直方向上加了一个小偏移。右侧上面的那张图片是传统的latlong天空盒,对开放世界的赛车游戏来说,天空的下半部分的表现更加重要,所以我们将纹理偏移,给下面纹理更多的分辨率。此外,我们将纹理裁成上下两半,上面的一半大小缩为原有的1/4,下面的一半保持不变,从而节省了3/8的空间。

数据处理方面,我们使用了80TNAS存储与离线备份。美术师的工作站因为涉及nuke的大量的IO操作,使用了较大的SSD存储。虽然大部分工作能够自动的进行,但是仍然需要大量的手工操作。我们仍然雇佣了专门的美术人员来处理天空,大概每个天空耗时1个月。

 

数据已经处理完成了,我们做了一个demo来进行效果的比较(第一张图是FH2的天空系统的效果,下面两张图是使用拍摄得到延时序列与IBL的效果)。可以看到除了天空的云彩效果更加真实之外,地面的光照与天空也是一致的。有了这个demo我们能够说服大家通过延时摄影来制作天空是一个可行的好想法。

 

还有一些挑战需要解决,虽然我们得到了很好的延时拍摄得到的天空盒序列帧,但是为了能够最终将这些内容使用到游戏中,我们需要将这个序列帧的帧率降到足够低。我接下来要讲的是如何在时间间隔较大的两帧天空盒之间得到连续的变化效果。

我们做出的第一个尝试是设定一个主运动方向。这张图是一个Debug显示模式,图中的长线指示了序列帧帧间的运动方向。这个运动在远方会有一个消失点(即所有纹理集中运动到一个方向的点上)。这个方式大体上是对的,在自然环境中云彩也是这样运动的。但是这个方法是美术的控制曲线无法控制的,我们只能设定一个云彩的运动方向与速率,当这个方向与插值方向有出入的时候会有折线的错误出现。

但是另外一个问题是天空中的太阳在天空盒上是在一起的,但是太阳的运动是不应该受云彩的主运动方向控制的。我们被迫开发了一个系统来在天空盒中找到并跟踪太阳,如图中红色的部分所示,太阳及其周围部分不会受主运动方向的影响。

这种方法的效果有些诡异,应为接近太阳的云彩是静止的,而其他部分的云彩是快速运动的。我们需要其他的方法。

 

我们最终使云彩的运动向量来控制运动的方向。我们将天空盒序列传到NUKE中,使用NUKE原生的向量生成器,来生成云彩的运动纹理。这张纹理是四个通道的32位浮点纹理,其中两个通道描述当前帧到下一帧一半的帧间UV运动,另外两个通道是到前一帧的UV运动。

我们输入一个两分钟间隔的序列帧,图像是一跳一跳的。

 

使用运动向量之后得到了很平滑的帧间过度效果。我们能够看到小块云彩的运动与变化。虽然我们帧间隔时间是两分钟,但是我们仍然能够以60帧每秒的速度进行天空的绘制。

我们的天空序列帧以0.008帧每秒播放,中间帧通过运动向量插值得来。经过测试我们发现可以将运动向量的大小压缩到纹理的四分之一大小。并且我们将32位浮点的运动纹理每个通道缩放到8位以节省空间(得到右侧下图的彩色图像),在运行时再将运动值缩放到原有范围上。

问题的关键是如何处理运动与帧率的矛盾。在NUKE中计算运动向量的方法实现了在极低帧率的情况下插值的计算,这个方法能够让我们将拍摄的天空盒集成到游戏中并且不会给流式加载带来太大的压力。

 

接下来我要介绍的是这种方法给我们在光照方面带来的额外的好处。

这部分首先需要介绍的是光照探针的校准。

在这页的世界照片中,我们能够看到我们照片中拍摄了一个灰色的球。在北半球进行拍摄的时候,我们将光照探针朝向北边,在南半球进行拍摄的时候,我们将光照探针朝向南边,这样我们能够获得从太阳升起到太阳落下大致的光照情况 (译注:以高纬度北半球为例,太阳的光线一般来自与南方,所有要将光照探针放在背面,拍摄球体朝南面上的受光情况,球体朝北面基本是暗面拍摄意义不大。提及南半球,因为他们之后去了澳洲进行拍摄)

下面的图是我根据光照探针上的最大光强绘制的曲线,在这个区线上能够看出日出日落的变换,还能看到一些波动的情况,这是受天空中云彩的遮挡造成的,我们可以根据这条曲线来控制游戏中的环境光光照变化。

举个例子,左图是NUKE中的原图效果,右图是我们在开发中Xbox开发所使用的Pix中的效果。上面一行是在云彩的影子中的情况,下面是不在影子中的情况,我们并不是通过调节太阳的光照强度来控制环境光。

这给了太阳、天空和环境光一个比较好的平衡,左侧的图片是接近完成的游戏中的场景,右侧是拍摄的天空照片。

对于太阳与地面夹角较小的情况,太阳与地面环境光强度的关系也很真实。

 

我们可以在当前天空盒的基础上创建其他需要的纹路,比如每一帧的雾的天空盒。我们将天空盒进行简单的高斯模糊。对于天空盒的下半边,我们将上半个天空盒翻转下去,并将太阳从图中移除。这种Fog的天空盒能够很少的将远处的物体和天空融在一起。下面的图片实在FH2中使用FH3的系统的效果,可以看到远山很好的融入到了天空之中,这比直接由美术直接指定的雾的颜色得到的效果要好。

我们对天空盒作为上半球光源进行离线的卷积计算得到天空漫反射的间接光照的天空盒。相当于直接站在山顶,周围没有物体遮挡的光照情况。在游戏中,我们将这个环境光与GI的基于体素的AO系统结合起来,来得正确的光照效果。

 

另外一张纹理是我之前提到的cloud mask,我们之前使用这张图来控制云彩对天空/星星的遮挡。我们也使用这张图来控制远处的云彩在地面上的投影。我们将cloudmask转成一张cubemap,远处的地形的阴影情况直接向上投影查询当前的阴影情况。我们发现这种方法能够很好的实现云彩的投影,看起来真实自然,而不需要使用复杂的光线追踪的方法。但是这种方法在车的周围并不合适。因为在游戏中可能会出现玩家运动方向有云彩在地上投影同向的情况,一般情况下,人们希望在驾车时云彩是向后运动的。

为此我们制作了滚动的云彩纹理,来实现玩家驾车时,云彩阴影向后运动的效果。我们这张纹理同样来自与NUKE的计算,来保证天空盒拍摄时与当前环境的一致。

在这里我要提到在FH2中我们努力实现的天气系统,这个天气系统能够和我们的天空盒很好的结合。我们给天空序列打标记,来驱动天气系统。

 

另外一个好处是这个拍摄得到的天空给了场景相机HDR曝光值一个标准。我能够将其他地方拍的照片拿进来进行比较与参考。比如下面的例子。

这是我们在项目早期做的测试,图中的照片时我对我车的拍的照片,将这些照片转换到HDR下。在傍晚时,仪表板上的光能够显现出来。

 

 

当切换到白天的时候,因为场景相机HDR曝光度不同,同一张纹理仪表盘上的光都没了。这是额外带来的一个好处。

 

在游戏测的开发同样占用了大量的实践。但是这种方法给我们带来了很多光照方面的好处,较之前版本大大提高了表现的真实感。

 

最后需要提一下的是我们在澳大利亚拍摄天空的工作

我们将这套装置打包运到澳大利亚。我们训练了两组摄影师在2015年的夏天拍摄了25天的天空,为我们的制作提供了足够的数据。

 

我们得到目标地的真实的天空、光照信息(如日出日落时间)和天气信息(真实的天气情况)。这是我们在接近完成版游戏中澳大利亚天空的效果。

 

 

 

 

让我们最后总结一下,这个分享中所介绍的内容涉及到多个部门大量的工作,基本上涉及到了所有部门(美术,程序工程师,关卡设计师,管理层团队,IT支持团队)。拍摄和处理天空数据同样需要大量的投入。天空系统不负众望为整个游戏的画面表现提供了极大的贡献。减少了美术驱动的数据,并给基础光照提供了参考。

最后虽然给项目的开发增加了不确定性,但是自然的表现更加可控,更加真实。我对我们最后达到的效果十分满意。谢谢。

 

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

0个评论