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预计算。即使使用质量较低的阴影,在运行时采用前向渲染,采用这些设置会使烘焙期间效果达到最好。你可以在烘焙完成后切回前向渲染或低图形质量。
引擎灯光工具
区域光源
- 可以改变位置和旋转。必须烘焙。
- 注意:镜面反射显示在表面的单一区域,与该区域光的大小和形状无关。
- 用于窗口和盒状的灯光(壁顶灯或灯管)。
点光源
- 可以调整位置,但旋转无效。
- 一个光秃秃的灯泡,会向各个方向散射光线。用于普通的灯泡环境。
聚光灯
- 可以设置位置和旋转。
- 用于手电筒,泛光灯,和天花板灯等。
方向光
- 位置无关紧要,但可以旋转。
- 灯光影响整个场景(但可以被屋顶遮挡,这与环境光不同)
- 使用方向光模拟户外太阳或者月亮光,或者创建一个室外灯光通过天窗来照亮室内场景。
- 方向光非常粗糙,产生的阴影也是生硬的。
环境光
- 会微微照亮整个场景(颜色可选)
- 这意味着即使未被照亮的区域也会有一丝光线
- 如果希望未照亮区域完全不可见,就要禁用环境光。
- 使用环境光来改变场景氛围。
全局光照
全局光照是为了实现更具有真实感的场景而计算来自直接光照的简单反射光和阴影。实时全局光照支持改变场景灯光,比如改变灯光颜色,移动直射的太阳光,从白天过渡到黑夜等等。为了提高实时全局光照的质量,增加预计算的分辨率。
光照探针
如果使用烘焙光照,那动态对象就不会有精确的阴影和光照信息。它们看起来很呆滞。使用Light Probes来添加真实感光照,阴影并为动态物体着色。它是预计算的光照信息卷积,可以作用于移入和移出此区域的物体,以较小的代价模拟实时光照。
光照探针用球面调和(SH)模型来存储光照信息。前向渲染器的基本通道渲染像素灯光和所有的SH灯光。这样一来,每个光照探针的CPU开销很小,也不会产生GPU开销。点此了解更多内容。
反射探针
对于镜子或镜面屏这样的反射表面,你需要在此表面上看到周围物体的倒影。这可以用一个反射探针简单的实现。可惜目前只能是立方体形状,最适用于立体房间。对于有动态对象的场景,你可以使用实时反射探针。对于静态场景(或为了降低性能开销),可以使用烘焙反射探针。
反射探针使用长方体投影精确模拟诸如大理石地板上的窗户倒影。立方体本身不会精准反射,而长方体的反射贴图可以解决这个问题。自定义立方贴图可以做更加逼真的“波浪”反射(例如在大理石地板上)。
自发光光照
在一个有灯罩的台灯场景中,灯罩上必须有自发光纹理。它将使灯罩显得明亮,对周围环境有柔和的光照。在里面还需放置一个点光源,使得台灯顶部和底部都能发出更清晰更明亮的光。这些光应该会被灯罩遮挡,因此这些光将会以双重锥体形状从灯罩中射出。区域光会有更好的阴影,但自发光贴图有成形的光(并因此产生有形状的反射)
照明场景
天花板灯光(管状或盒状灯)
可以利用标准着色器的自发光属性来实现带状和盒状灯精确而柔和的灯光。你可以使用区域光或自发光材质,或两者结合。天花板上的灯管可能在你直视它的时候发出明亮的光。在管状灯的各个灯管上使用自发光材质。用区域光来实现管状灯实际产生的灯光,实现带有更好的半影效果的阴影。
窗户
对场景的曝光控制和有限的眼睛动态范围,意味着在远离窗口时,室内应正确曝光,但窗口应该被表现出来,展现出明亮的光线和柔和的阴影。这可以通过HDR到LDR色调贴图来实现。当玩家从黑暗的室内移动到明亮的室外场景时,场景的曝光也会随之改变。
使用彩色纹理的窗户(例如:教堂的窗户)可以使用Cookie在地板上投射图案,但Cookie是没有颜色数据的灰度Alpha通道。这很棘手,需要一些黑科技
阴天
在一个阴天的户外场景,直射的“太阳”在通过云层时散射后产生的光线比较柔和。方向光可能不适合,因为它们产生的阴影非常生硬。可以考虑使用浅灰色的环境光,和充满乌云的天空盒立体贴图以及点光源来营造阴郁的光线和阴影。
云隙光
云隙光也被称为阳光光束或灯光轴,这在VR中效果很好,尤其是结合浮尘粒子。它的计算量很大,但Robert Cupisz正致力于实现一个轻量的灯光轴。unity的Asset store上有很多解决方案,但我还没有试过,所以这里没什么建议。
提高性能
以下是一些提高性能的技巧:
- 降低眼睛的渲染目标纹理分辨率。这是提升性能最简单,最直接的方式。
- 烘焙光照贴图可以搞定一切?几何体、灯光,和材质越多,会导致烘焙时间越长。将场景划分为多个层次,并分别加载它们。这能大大减少加载所需资源而占用的内存量,移动平台的内存限制非常关键。
- 使用前向渲染?尽量少用像素光。这可以在项目的Quality设置菜单进行更改。
- 实时光照开销很大。尽可能多使用烘焙光照并在运行之前禁用它们。
- 光照探针(球面谐和灯)的CPU开销很小,且没有GPU的开销。这是预先计算和模拟实时阴影的简便办法,而无需使用实时灯光。
旁注:VR中的灯光闪烁?
如果你的灯光在一只眼中闪烁(VR的左、右镜头),Unity会剔除灯光。我认为这是一个Bug。解决方法:将灯光标记为重要,这样引擎就不会禁用它了。记住,你也可以根据需求用代码来启用或禁用场景中的灯光,这样就能完全控制。
后期处理和关卡设计
设计真实感的光照时,场景的对比度要很高:明亮的区域,正确的阴影,以及黑暗的区域。不要照亮整个场景(例如环境光),否则将出现面片和游戏那样不真实的场景。
破坏阴影(即让阴影区域更加黑暗,几乎没有任何细节)是比较理想的现实。可以避免那种扁平的效果。
同样,要小心强光使一些区域过度曝光。
查找纹理(LUTS)
- 左:中性 右:标准 “平衡对比度”纹理
- 可以通过PhotoShop添加色调与色彩校正,修改阴影,曝光一些区域,并应用PS校正场景的每一帧。
- 用一个非常简单的LUT来彻底改变一个沉闷的场景,使其有完全不同的氛围
这是一个快速简单的后期处理技术,可以带来截然不同的效果。
游戏蛮牛编译