Unity3D技术交流 加入小组

18个成员 13个话题 创建时间:2015-09-15

详解Unity 5中的全局光照 置顶

发表于2016-02-28 1073次查看

Unity5在图形仿真和光照特效方面做了重大改变。自从3.0版本开始,Unity的光照效果一直局限于烘焙好的光照贴图。但后续的时间里,我们在全局光照领域有了很大的提升与改进,现在,是时候将其中部分美好的特性从Unity的沙盒中开放出来了。其中之一的新图形特性就是基于新的和极大改善的光照流程基础上的全局实时光照。这也是本文的重点。

  



什么是全局光照?

GI算法是基于光传输的物理特性的一种模拟。他是一种模拟光在3D场景中各表面之间的传输的有效方式,他会极大的改善你游戏的仿真度。不仅如此,他还可以传达一种意境,如果巧妙的使用,可以有效得改善你的游戏体验。GI算法不仅考虑光源的直射光,而且还考虑场景中其他材质表面的反射光。传统上,在游戏中,由于实时性的约束,间接光照的模拟因性能消耗过大而被弃置一旁。

这些都是源于下面这个浅显的方程:
 



这个很简单。从某一观察点看到的光是从场景中物体表面点入射的光(Le)与从观察点上方的半球入射的光的叠加。Li描述的是从半球上某一角度w’ 入射的光。反射项p描述的是光线如何反射到观察点,这项的取值依赖于入射角w’和观察者的角度w。

细心的读者可能已经发现L(x,w)在方程的两边,而且有一个还在在积分式中。如果不是这种情形,我们也许已经计算出全局光照的结果。由于物理规律是不太可能去修改的,研究协会提出了一套解决方案。

其中最流行(最古老的)的是光线跟踪算法。这个算法从根本上改善了GI算法,在算法最困难的部分使用了一些比较耗时的技巧。光线跟踪在电影或者电视的CGI上使用了很多。尽管该领域涌现了大量的研究成果,但是一张图像的渲染还是要花费数秒的时间(哪怕使用非常先进的GPU)。

光线跟踪通常使用的是屏幕空间,所以,一张图像每一帧都需要重新渲染。这意味着,他完全支持完全动态的场景:灯光、材料、几何形状自由变换的动画。这也是一个缺点,因为每当摄像机移动的时候,一张新的图片需要被渲染,而这张新图像的收敛融合需要花费数秒钟的时间。这也导致他无法适用于游戏场景。

一张没有完全收敛融合的图像会有很多噪点,而且他是时间不相干的,所以,图像在完全收敛融合之前会有严重的闪烁。可以使用滤波来降低这种影响,但是不能彻底消除。下面是一些在不同收敛融合程度的图像。
 

 
Path traced images at various stages of convergence.



最近,有了很多新的图像混合的算法,其中大部分都在GPU中运行,例如体椎追踪。这些算法中的大部分需要在具有一定内存大小的台式GPU上运行,他们只适合于高端PC系统。为了让全局光照在更多的平台(包括手机)下运行,这里做出了一些妥协。

Enlighten介绍:
Enlighten对于该问题提供了一套很好的解决方案。通过对问题的约束优化,他适用于各种尺度的终端机,从手机到街机,一直到高端的台式机。他已经被运用于Battlefield4,MoH Warfighter等AAA游戏。他是稳定可靠的。

他的基本思路是如果一些可见光是预计算的(上面那个GL方程右侧的积分体),那么在移动端实现实时光照就是可行的。

Enlighten允许的动态更改:
光源
环境光
材质属性(漫反射率和表面自发光)

GI仿真中的几何体部分必须被设置为静态的。但是动态的几何体可以使用GI根据静态几何体生成的光探针进行实时渲染。为了实现这个功能,Enlighten预计算GI实时仿真需要的数据。这个数据存储在一个实时模块中,该模块适用于大部分平台:SX, Windows, Linux, iOS, Android, PS Vita,PS3, PS4, Windows Phone, Xbox360 and XboxOne。WebGL目前正正在开发中,还不确定何时支持。

Enlighten输出数据如下:
实时光照
实时光探针
实时立体贴图

Enlighten受限于GI对于漫反射传输的计算。漫反射是最重要的传输方式,因为他包含了全局光照的信息。由于漫反射是低频的,所以实时光照贴图可以是一张实时更新的低分辨率图像。另外通过增加动态更新的立方贴图来实现镜面/光滑面的反射。在Heckbert notation中,Enlighten使用了光线追踪子集L(D)*(S|G)?E。这意味着Enlighten包含了大部分的GI效果。而缺失的效果中最重要的是镜面反射(俗称散焦),你得用些技巧来达到该效果。

下面是使用Enlighten,两种不同的光线设置渲染图像的例子。这些光线设置是完全动态的,而且之间的切换时瞬间的。
 


Viking Village – dawn



接下来的这个镜头,使用了更加明亮的蓝色天空和更高更强烈的阳光:


Village – sunny day



下面这个镜头降低了阳光的强度,环境光为灰色且不饱和的。主要为环境光照:


Viking Village - overcast day



最后是一张日落时分温暖静谧的画面:

Screenshot_13.jpg (679.76 KB, 下载次数: 5)

下载附件

2014-9-24 18:01 上传


Viking Village – sunset



使用这种技术,可以赋予你游戏非常逼真的时间周期。

Enlighten预计算

场景中的大部分几何体都必须是静态的,实际上,这些大尺寸的几何体都会参与到GI的计算。在预计算阶段,Enlighten会自动将场景分解为数个子系统。去影响如何生成这些子系统是有可能的。这些系统被用于预计算大量的并行管道。管道之间是深相关的,并解决每一个系统的任务。这里有一个例子用于阐述Viking村落时如何被自动分解成多个子系统。
 


Editor visualization of the automatically generated Enlighten systems.



自动生成的Enlighten系统的编辑可视化

在预计算完成后,系统之间的相互关系就确定了。这可用于在运行时部分减少对于静态几何体的限制。在运行时,在不同系统之间传输的间接光总量是可以控制的。这可以让你在系统切换之间实现淡入淡出,可以用于实现拆除或者打开们的效果。

Enlighten运行时:

Enlighten可以有效地运行于高端移动设备。他在一个线程中异步执行(或多个,如果平台允许)。移动平台中最突出的是直接光照或动态光照的阴影贴图需要在GPU中计算。所以,移动平台中只允许少量的动态光照。但是实时调整几何物体的自发光属性却是几乎无消耗的。Enlighten将自发光的物体作为可见物体计算。这意味着,自发光物体可以产生很好的阴影而不需要什么性能代价,即使在很低的分辨率配置下。

得益于GPU对于直接光照和阴影投射的支持,Enlighten可以很好的实现动态光照,无论是在台式机系统还是街机,只要是能支持游戏的系统。

这里是一个在ARM架构的平板上使用Enlighten的例子。

关于烘焙:

对于某些游戏来说选择烘焙可能更合适,所以将来也会很好的支持和发展烘焙流程。Unity5中光照的输入参数有:光源、自发光材质及环境光,你可以选择使用烘焙或者实时GI。选择烘焙的光照和Unity之前版本有同样的参数,它将被烘焙成光照贴图,而动态光照则由Enlighten运行库来处理。烘焙和实时GI可以无缝融合。

Unity5中也有些新的烘焙特性。其中之一就是光照贴图被分散成组件形式。每个图集都包含5个光照贴图,它们分别是直接光照、间接光照、直接方向光、间接方向光和AO图(环境光吸收)。烘焙完成后,它们组合成光照贴图供游戏使用。在编辑器中可以指定这些图的融合参数。你可以调整这些选项来适配你最终的输出效果。例如,你可以很轻易的增加间接照明,这只需要在重新烘焙之前增加一个合成的工作,当然这个工作会花费你数秒钟的时间。

光照流程

Elighten不仅仅提供游戏中的实时GI。其中一个很重要的改进就是,Elighten为设计师们提供了全新的光照流程。当设计师们需要看到更高品质的细节的时候,它提供了更快的迭代模式。它使用迭代取代了完全重新的烘焙。不需要用户的干预,场景会被重新预计算与烘焙的效果替换,而这些预计算与烘焙都是在后台完成的。编辑器会自动检测场景的改动,并且执行所需的步骤来修复光照。大多数情况下,对光照的迭代几乎是瞬间完成的。

下面是一个使用新的光照流程的视频教程:



什么类型的游戏需要用到Enlighten?

之前提过,实时GI的局限性在于大规模的场景设定必须是预先确定的。是追求只适用于高端系统完全动态光照的解决方案,还是覆盖尽量多的场景并且可以在移动平台使用从而拥有更广阔的市场的解决方案,我们只能二选一。在5.0中我们选择了后者。下面是使用实时GI会存在一定困难的游戏类型列表:
           
Q:可以实现开门效果吗?
A:上文探讨过,场景会被自动划分为子系统,所以这取决于你的门,某些情况下是可以的。而另外一些就要借助脚本了。 (相关脚本会在5.x的版本中发布)

Q:支持销毁吗?
A:Enlighten支持场景中物体的动态透明。这意味着,游戏中要被销毁的物体需要首先被标注。当然这不是最理想的解决方案,他应该支持更多的功能。(该功能会在5.x中提供)
       
Q:我可以通过流或者块加载关卡吗?
A:当然,子系统可以通过流加载。你可以让你的场景块不包括子系统,然后手动或者通过脚本加载。(该特性会出现在5.0)

Q:可以使用一些预先做好的模块来代码实现游戏场景吗?
A:可以的,如果预先计算好模块所在位置的不同组合,你可以实现各模块之间的切换。这个就类似于你制作跑酷时的光照烘焙(无缝)。(这里所需要预计算的API会在5.x中提供)。
       
Q:可以完全使用代码实现游戏世界吗,类似Minecraft?
A:长话短说,不可以。然而,我们也在做很多项目,其中使用了ImaginationTechnologies中PowerVRRay Tracing然而来实现GI预览和混合。这可能是一个备选的方案用来解决由程序或者玩家创建场景的问题。PowerVR Ray Tracing技术支持全动态场景的GI。他不是全实时的,而且开始出现的数帧里可能会有噪点(因未融合收敛),但这是一个非常有前景的方向。在允许一定的延迟的情况下,它非常适用于用户自定义场景的光线渲染。(因项目还在研发阶段,暂时还没有案例)

哪些是Free版,哪些是Pro版所拥有?

这些特性在Free版和Pro版中的界限目前还不清晰,我们会在后续的博客中公布。

5.0中有哪些?
下面是5.0中的主要功能:
游戏实时GI组件Enlighten
迭代流程(服务于实时GI与烘焙)
反射探针

5.0后续:
由于我们正对光照流程和生成做了很多的改动,其中一些因存在一些潜在bug可能会导致5.0的崩溃,后续我们会努力修复。下面这些是在5.x系列周期内会出现的特性:
实时光照和烘焙光照的PowerVR追踪算法
控制实时GI子系统间切换的API
Enlighten实时立方贴图
GI的实时透明支持
预计算/烘焙的云/集群计算

原文标题:Global  Illumination in unity5
来源:http://blogs.unity3d.com/2014/09/18/global-illumination-in-unity-5/
感谢Unity官方中文社区翻译组成员:“penguin_ku ,小七” 对本文翻译所做的贡献。

1回复
  • 2楼 小白 2016-03-08

    这个不错,学习了!谢谢楼主分享

发表回复
你还没有登录,请先 登录或 注册!