美文网首页
Unity5中的光照简介(上)

Unity5中的光照简介(上)

作者: JumboWu | 来源:发表于2016-03-07 21:56 被阅读318次

          Unity5中的光照可以用整本书来说明,此文是过去几个月使用Unity5的简单汇总。下面主要分6个部分来讲解。

    Forward(前向)与Deferred(延迟)渲染

    Realtime(实时)与Baked(烘焙)光照

    引擎的光照工具

    光照场景

    性能技巧

    后期处理

    上述的大部分对于Unity制作的内容都是适用的,并不局限于虚拟现实应用。这是非常高级的内容介绍,需要读者具备基础的图形和光照的概念。下面开始吧!

    前向与延迟渲染通道

    如果心怀疑虑,请使用前向渲染通道。前向渲染通道对VR应用来说很理想,有以下几点原因。前向渲染在前期的性能开销较低,DrawCall较少更宜在CPU运行,在移动VR设备上也同样运行的很好,它还支持抗锯齿和半透明材质。以下是能帮助你决定应用适用渲染管线的简单指南。

    延迟渲染

    延迟渲染前期的性能开销很大,但它是一个固定的性能开销,添加再多的几何体和灯光也不会产生过多的额外开销。你有几百个实时灯光?那就使用延迟光照吧。延迟光照的开销是与灯光照亮的像素数量成正比的。场景复杂度(灯光照亮的物体数量)并不会影响性能。旁注:UE4 只有延迟渲染管线,这就是UE4制作的Demo在较老的PC上运行缓慢的一个原因。

    优点

    延迟渲染最适用于包含大量小体积实时灯光的场景。

    每个光照都可以当作一个逐像素灯光来渲染,以便在法线和深度贴图中可以精确着色。

    每个光照都有一个实时阴影。

    权衡

    延迟渲染器无法渲染半透明材质。你需要为半透明材质添加一个额外的前向通道。

    平行光在延迟渲染器中开销很大。它们影响整个场景,且光照体积无限大。

    产生大量Draw Call(场景中每个物体产生的两个Draw Call乘以每个灯光产生的两个Draw Call。)

    不能抗锯齿(这对于VR非常不利,因为VR极度依赖MSAA来减少闪烁和忽隐忽现的线)。

    前向渲染

    前向渲染的前期固定开销较小,因而最适合复杂度较低的场景,但其性能开销与场景复杂度成正比。如果你的场景中只有一对实时灯光,那就使用前向渲染吧。前向渲染器的成本与场景中灯光的数目成正比。像素灯越少则性能越高。

    权衡

    在每个渲染通道中,每个被像素灯光照到的对象都会被渲染。如果一个对象被10盏不同的灯光照亮,那它将被渲染十次(每个光照通道一次)。这就是前向渲染通道中被灯光照亮的物体越少越好的原因。

    从设计上限制灯光数量。

    基本通道用实时阴影渲染一个方向光,并用额外的通道来渲染其余的灯光。然而,这些额外的灯光不会有阴影。

    像素光照数量有限,其余的都是顶点光照。和逐像素光照对象相比,顶点光照提供的效果较简单。

    好处

    Draw Call较少。每次像素光照射到物体,就会产生一次Draw Call。最坏的绘制调用计数情况是(场景中对象数量*照射到对象的像素光数量)。有很多降低Draw Call的方法(批处理等)

    锯齿(8XMSAA,非常适合VR)

    支持半透明材质

    如果你的目标平台是移动端(如GearVR),使用前向渲染通道,限制像素光数量为1~2个

    当在前向和延迟渲染间犹豫不决时,别忘了我们这里只讨论实时灯光。场景中有多少烘焙光照都是可以的。烘焙光照贴图,并在运行之前禁用它们。运行时渲染器只会考虑场景中的实时灯光。

    实时和烘焙光照

    如果你在乎阴影的真实,那就烘焙灯光。硬阴影或者软阴影在一些情况下已足够,但在很多情况下仍不能接受。(比如桌子上的点光源)。在实时光照下,你可以在地面上看到块状阴影。在烘焙光照下,你看见的是一个柔和的,散布在桌下的阴影。实时灯光只在光照有变化(颜色,位置等等)的情况下是必要的。烘焙光照和阴影不会随着实时移动的对象而改变,但可以用小技巧来弥补。(见下面的“光照探针”)。

    提高烘焙光照贴图质量

    在烘焙时,你可以通过增大烘焙分辨率滑动条(合理的纹理像素分辨率是40~100)来提高光照贴图质量。启用环境光遮蔽(Ambient Occlusion)和最终聚集(Final Gather)。在烘焙之前,检查工程的Quality 和Player 设置。在Quality选项卡中,使用高分辨率的硬阴影和软阴影。在Player选项卡中,选择延迟渲染器。在烘焙前禁用GI预计算。即使使用质量较低的阴影,在运行时采用前向渲染,采用这些设置会使烘焙期间效果达到最好。你可以在烘焙完成后切回前向渲染或低图形质量。

    引擎灯光工具

    区域光源

    可以改变位置和旋转。必须烘焙。

    注意:镜面反射显示在表面的单一区域,与该区域光的大小和形状无关。

    用于窗口和盒状的灯光(壁顶灯或灯管)。

    点光源

    可以调整位置,但旋转无效。

    一个光秃秃的灯泡,会向各个方向散射光线。用于普通的灯泡环境。

    聚光灯

    ·可以设置位置和旋转。

    ·用于手电筒,泛光灯,和天花板灯等。

    方向光

    位置无关紧要,但可以旋转。

    灯光影响整个场景(但可以被屋顶遮挡,这与环境光不同)

    使用方向光模拟户外太阳或者月亮光,或者创建一个室外灯光通过天窗来照亮室内场景。

    方向光非常粗糙,产生的阴影也是生硬的。

    环境光

    会微微照亮整个场景(颜色可选)

    这意味着即使未被照亮的区域也会有一丝光线

    如果希望未照亮区域完全不可见,就要禁用环境光。

    使用环境光来改变场景氛围。

    全局光照

    全局光照是为了实现更具有真实感的场景而计算来自直接光照的简单反射光和阴影。实时全局光照支持改变场景灯光,比如改变灯光颜色,移动直射的太阳光,从白天过渡到黑夜等等。为了提高实时全局光照的质量,增加预计算的分辨率。

    相关文章

      网友评论

          本文标题:Unity5中的光照简介(上)

          本文链接:https://www.haomeiwen.com/subject/unfzkttx.html