[官方培训]06-UE光影基础 _ 李文磊 Epic 笔记

发布时间 2023-09-15 21:32:49作者: Tcohneyn

UE光影基础

光照系统

UE4 光照系统

在这里插入图片描述

UE5 光照系统

在这里插入图片描述

直接光及阴影

  • 定向光源 定向光源 将模拟从无限远的源头处发出的光线。这意味着此光源投射出的阴影均为平行,因此适用于模拟太阳光。
  • 点光源 点光源 的工作原理很像一个真实的灯泡,从灯泡的钨丝向四面八方发出光。然而,为了性能考虑,点光源被简化为从空间中的一个点均匀地向各个方向发射光
  • 聚光源 聚光源 从圆锥形中的单个点发出光照。使用者可通过两个圆锥形来塑造光源的形状:内圆锥角外圆锥角。在内圆锥角中,光照将达到完整亮度。从内半径的范围进入外圆锥角的范围中时将发生衰减,形成一个半影,或在聚光源照明圆的周围形成柔化效果。光照的半径将定义圆锥的长度。简单而言,它的工作原理类似于手电筒或舞台照明灯。
  • 天空光照 天空光照(Sky Light)捕获关卡的远处部分并将其作为光源应用于场景。这意味着,即使天空来自大气层、天空盒顶部的云层或者远山, 天空的外观及其光照/反射也会匹配。你还可以手动指定要使用的立方体贴图。(天空光在Lumen下是间接光对待的
  • 矩形光源 矩形光源 从一个定义好宽度和高度的矩形平面向场景发出光线。您可以用它来模拟拥有矩形面积的任意类型光源,如电视或显示器屏幕、吊顶灯具或壁灯。

演示

  • 灯光可以通过拖拽来放置,也可以通过按住L再左键点击场景快速的添加点光源
  • 灯光方向位置的调整除了拖拽旋转外,还可以通过右键光源控制(Pilot)的方式,对灯光以第一人称的视角来调整。Pilot的朝向是灯光的local space下的x轴的朝向。
  • 灯光的参数大致可以分成四类光质,光强,光色,阴影
    在这里插入图片描述

光质

光质是影响灯光气氛(灯光的软硬)的重要的一个因素。它取决于灯光对对象的一个包裹程度。灯光面积越大,距离对象越近,包裹感越强,灯光就越软。反之灯光就越硬。

  • 点光源和聚光源可以通过调整源半径这个参数来改变灯光的光质。

  • 面积光源是调整源宽度和源高度来调整光质。

  • 定向光源是调整源角度(从地面上看天空,太阳在视野里的夹角)来调整光质。默认的0.5和地球上太阳的大小类似,通过调大可以模拟非常大的太阳或者太阳躲在云后面,还是有一定照度下的面光源的效果。

光质对材质高光表现的影响

灯光的面积大小(比如调节源半径)可以影响高光的聚散,软源半径可以用来柔和高光的表现。
在这里插入图片描述

另外影响高光表现的灯光参数是高光度范围(Specular Scale),它的的范围是0~1,这个参数是非物理的不基于能量守恒的,我们降低了高光表现在漫射方面不会有相应的弥补(使用时需要注意)。

光色

灯光的颜色主要通过调节色温和直接在色轮取色调整。

建议先用色温来调节再用色轮调整。

常用色温

  • 火光1700
    在这里插入图片描述

  • 室内暖白光3500
    在这里插入图片描述

  • led冷光9000
    在这里插入图片描述

用EditorUtilityWidget 来制作一些灯光工具界面,来方便打光。
在这里插入图片描述

另外,面光源可以直接赋予一张贴图来改变颜色,相当于投影仪的效果。

注意事项

灯光的显色性是对固有色表现的一种能力。UE中没有显色性的概念。

但是当你使用非常极端的颜色,比如色轮边缘的颜色,会导致某些RGB的通道失灵。最终颜色=灯光颜色乘以albedo(反照率纹理),当灯光是0 时候,这个通道乘起来就是0。导致对比色绿色的albedo完全呈现黑色。
在这里插入图片描述

所以取色时候尽量稍微离开点边缘,这样可以表现一些原来的固有色。
在这里插入图片描述

光强

UE中光强有两个单位Candelas(烛光)和Lumens(流明),这两个是基于物理的单位,可以模拟真实世界灯光的照度。

我们还可以通过IES的灯光文件来模拟灯光的真实照度,但要配合摄像机的EV值来使用。在这里插入图片描述

方向光的强度单位是lux(被光均匀照射的物体,在1平方米面积上所得的光通量是1流明时,它的照度是1lux)。

灯光衰减

灯光衰减是指光线强度随着距离增加而减弱的一种方式,UE中的灯光衰减方式使用的是反平方衰减,跟真实世界的灯光衰减方式是一致的。是一种非常强烈的衰减方式。

灯光的距离是跟表达相关的,不能把非常远的灯光放在近距离找照明,这样就会使得让人感知灯光的距离比较近表达不出想要的效果。

但有时候由于技术和习惯的限制,把非常近的灯光用来照明,来表达非常远的灯光,我们就要调整它的衰减方式。把反平方衰减的选项关掉使用线性衰减来表现出远距离的灯光效果。能够让打光变得更加方便,距离放的近灯光,灯光范围也不用很大,对效能也有好处。

阴影

直接光的阴影在UE5中有3种方式

  • 光线追踪阴影
    在这里插入图片描述

  • 阴影贴图(shadowmaps)
    在这里插入图片描述

传统阴影贴图对于方向光来说根据物体离摄像机的从远到近可以应用三种不同的shadow的方式。

  • 最近距离CSMshadow 1500以内

    • 调节参数动态阴影距离静态光照
  • 中距离距离场shadow(根据物体的距离场来投影)1500-3000

    • 距离场阴影距离
  • 最远也是CSM,但是可以根据对象有选择性的开关 3000开外

    • 远阴影级联数,远阴影距离
      在这里插入图片描述

远阴影要显示需要打开对应物体的远阴影开关
在这里插入图片描述

调整阴影参数

  • 光源参数设置 Shadow Resolution Scale 调整分辨率缩放
  • 光源参数设置 Shadow Bias 调整偏移
  • 光源参数设置 Shadow Filter Sharpen 调整锐化
  • 骨骼网格体启用 Dynamic Inset Shadow 可以让阴影精度变高

对于locallight(局部光)它们三个投射的shadow无论对于角色还是静态的模型都是Per-Object Shadow

正因为是Per-Object Shadow每个物体都是基于它的Bounds投射一个单独的shadow map。所以当场景中物体非常多的时候,并且放置的灯光是Point light(Point light会从四面八方六个方向投射阴影),阴影的开销会非常非常大。

Virtual Shdow Maps

开启Virtual Shdow Maps的前提是开启DX12。

优点

  • 精度比较高
  • 实现半影效果:在开启Virtual Shdow Maps的情况下,调整光源半径
  • 对于静态的物体的静态阴影可以做cache,大大提升阴影的渲染效率
  • 让shadow变得更加简单

光照生成的虚拟阴影贴图数量:方向光16张(16k×16k),点光源6张(16k×16k),其他光1张(16k×16k)

Virtual Shdow Maps的加载方式

  • 视图模式中有VSM的可视化
  • 每个小方块是一个Page,每个Page的分辨率是一样的,根据摄像机距离的远近,Page覆盖的面积是不一样的,这就可以保证在屏幕空间里shadow的pixel rate保证基本一致。
  • 对于人眼来说shadow的精度不会因远近有太大的区别
  • 方向光要照到的面积大,与locallight呈现方式不一样,用clipmap呈现。每个分辨率为16k x 16k。一共16张。
    在这里插入图片描述
    在这里插入图片描述

Virtual Shdow Maps品质控制

  • 局部光

    • 大面积的灯光照射正常物体,会造成阴影精度不高,应缩小灯光范围;正常面积的灯光照射小物体,会造成阴影精度不高,应放大物体,总结就是灯光的照射面积和物体之间的尺度比例过大的情况下,都会造成阴影精度不高

    • 在系统认为自适应ok,并且灯光的面积为0的情况下,会产生一定锯齿,如果需要减少阴影的锯齿,可以提高灯光的面积,也可以使用控制台命令:r.Shadow.Virtual.ResolutionLodBiasLocal -1(减任意数字)

  • 方向光

    • 方向光在长焦(摄像机里物体很远时,会出现覆盖物体的virtual texture和物体之间的尺度比例过大)下也会出现上述问题,但没办法解决,所以要尽量避免在这种情况使用方向光
    • 拍摄非常小的局部特写细节阴影精度会有问题,可以通过提升第一级clipmap的精度(通过减少范围来提升),命令r.Shadow.Virtual.Clipmap.FirstLevel,默认是r.Shadow.Virtual.Clipmap.FirstLevel 6
    • 方向光在启用VSM和物体启用Nanite的情况下,阴影都是VSM;若物体没有启用Nanite则近处是VSM,中距离是距离场,远处是VSM;使用r.Shadow.Virtual.UseFarShadowCulling 0 将所有阴影替换为VSM
    • 非Nanite mesh不像Nanite mesh对于方向光默认开启所有都使用VSM的原因:
      • 非Nanite mesh不像Nanite mesh对于方向光的VSM,无论在渲染的批次和三角面上都有很大的优化
      • 非Nanite mesh不支持Nanite往往是因为一些材质的效果,比如WPO材质(往往用在植被上来模拟动态的移动)
      • WPO材质的非Nanite mesh在VSM的情况下是不能被cache的
      • 对于全程开启了VSM的非Nanite Mesh,并且加了WPO的模型可以通过命令 r.Shadow.Virtual.Cache.MaxMaterialPositionInvalidationRange(后面加个距离数) 来让某个特定距离的WPO材质关掉,这样能够让这个特定距离的VSM能够cache
  • 在三角面比较低的模型上Virtual Shdow Maps投影会产生问题,问题原因是三角面比较低,所以面法线是通过顶点的混合或者过渡插值出来的。它的法线认为它是在阴影之前,但事实上它面的深度是在阴影之后。这样导致阴影有的时候在前有的时候在后。

  • 解决方法

    • 用命令行r.Shadow.Virtual.NormalBias,但这样会导致某些细节高的模型阴影的细节的丢失,所以需要平衡

    • 推荐方法提高三角面数,让法线和深度匹配,来解决低多边形几何体的阴影瑕疵问题

在这里插入图片描述

光线追踪阴影

优点:精确高质量的半影,比VSM的假半影要好很多。

  • 项目设置中启用光线追踪阴影
  • 设置光源里的逐像素采样(Samples Per Pixel) 调整光追的质量
  • 如果场景模型是Nanite模型使用光追会产生问题,因为投影的模型是一个低模,将低模的阴影投在了渲染的高模上,通过设置静态模型的 Fallback Relative Error 让低模面数等于高模,可以基本修复这个问题,但没法消除

Nanite和VSM更加匹配

间接光及阴影

(GI)全局光照明Global Illumination,场景光源在景物表面产生的全部光照效果。包括直接光照和间接光照效果。

Lumen是一种动态的全局光。它包括固有色(GI)和镜面反弹(反射)。

Lumen的光线追踪

光线追踪的机制,不同于光栅化的渲染方式。光线追踪是从当前摄像机的角度,位置抛出一根射线,到屏幕内的某物体某像素上面,再以这个像素为中心射出多条射线去追踪环境里的信息(颜色,材质等),然后通过收集这些信息,再结合它本身的属性来对这个像素进行着色。

  • 光线追踪的过程需要大量的射线,才能保证比较好的质量
  • 追踪的运算是非常耗时的,所以整个过程效率比较低

Lumen通过几种方式加速了这个过程

  1. 抛出射线的数量被大大减少了
  2. 追踪的目标叫做Lumen Scene,是简化的可以被缓存下来,简化的材质,模型或者模型的距离场。
  3. 通过不同的追踪方式的混合来加速

通过以上几种方式可以在保证高品质的情况下,大大增加渲染速度

Lumen scene的生成过程

  • 材质信息的捕获

Lumen Scene的材质信息是通过在对象的周围放置一些捕获点,叫做Card,然后从四周投射捕获它材质的信息,这个材质信息叫做Surface cache,命令r.Lumen.Visualize.CardPlacement 1 查看捕获点。
在这里插入图片描述

查看四周投射捕获的材质信息,通过 View Mode > Lumen > Surface Cache 视图模式
在这里插入图片描述

Surface cache对于一些小物体会被miss掉,为了加速会忽略这些小物体。通过调整后期盒子参数 Lumen Scene Detail,来将小物体纳入Lumen Scene Surface Cache的捕获中。

对于比较大还是miss掉的物体,可以尝试修复它,在它的模型编辑面板里搜索card,增加它card的放置数量(默认12块)来增加捕获精度。

软件光线追踪

  • 软件光线追踪设置
    在这里插入图片描述

  • 距离场比较低,通过静态网格体编辑面板中,调高参数 Distance Field Resolution Scale,再Apply Change来应用在物体上,来增加分辨率。

控制Lumen

  • 灯光对反弹光的强度进行控制

调整 Indirect Lighting Intensity 来增加间接光强度(增加Lumen scene),这个并没有改变画面中像素的亮度,只是改变二次反弹的亮度。

  • 通过材质来让Lumen scene 追踪的材质效果,跟final pixel渲染的材质效果不同,以便更好的来控制全局光。
  1. 对这个模型应用了自发光的材质,在final pixel渲染的通道连入红色,在Lumen scene的RayTraced通道连入绿色,最后连入Emissve通道
    在这里插入图片描述

  2. 在屏幕空间里大多数是ScreenTraced的情况下,因为final pixel是红色所以全局光是红色,当出屏以后追踪的是Lumen scene因为Lumen scene是绿色的,所以全局光是绿色的。所以使用中要注意
    在这里插入图片描述

  • 通过物体来控制对Lumen的影响

对物体决定它是否生成surface cache,选中物体关闭影响动态间接光照的选项,Lumen scene变黑,代表 surface cache没有生成,但对象还在。反应到外面是出屏的情况下Traced Lumen scene的反射变黑了。
在这里插入图片描述

在软件光线追踪的情况下关闭影响距离场光照选项,可以彻底将物体在Lumen scene中排除。它既不贡献Lumen的反弹光,也不阻挡其它的光线。最终效果出屏以后反射完全消失。
在这里插入图片描述

但是在硬件光线追踪中它不依赖于距离场追踪的是物体本身,关闭影响距离场光照选项,没有效果。想要完全排除的话,就要关掉光线追踪中可见选项。

后期处理盒子的Lumen

  • Lumen场景光照质量(Lumen Scene Lighting Quality),可以降低或提升Lumen scene lighting的质量从而提升Lumen最终的质量。
  • Lumen场景细节(Lumen Scene Detail),能够增加把这些细小的物体包括到Lumen scene里面来。
  • Lumen场景视野距离(Lumen Scene View Distance),对于天光在远距离可能miss掉,可以调节该参数。
  • 最终采集质量(Final Gather Quality),通过提升光线的数量以及计算上的复杂程度,来提升最终的效果。
  • 最大追踪距离(Max Trace Distance),光线最大的追踪距离。

单面模型和Mask材质(植被)在Lumen里的反应

  • 单面模型无论是正面还是反面在Lumen scene中都是有纹理的,并且背面的纹理是用得正面的

  • 材质的mask透明的地方在Lumen scene中是不透明的,是黑色的。这会导致间接光会被阻挡无法穿透过去,会导致植被变得比较暗。
    在这里插入图片描述

  • (5.1中已经解决),5.1中只要是subsurface的foliage,都会有一定的透光性。

注意事项

Lumen在产生surface cache的时候,抓的是模型的最高级的LOD的材质。LOD0是红色,LOD1是绿色的。正常视图下是红色的,Lumen scene下是绿色的。这就会导致在某种情况下产生不期望的Surface cache。比如植被做了LOD的模型,特别是最高级的LOD,很有可能是一个绕着摄像机转的billboard(简单来说billboard就是固定朝向摄影机的贴图矩形),给的材质是根据摄像机的视角会产生变化的材质。这个时候抓下来的surface cache就会有很大的问题。(5.1中已经解决)
在这里插入图片描述
在这里插入图片描述

Surface cache生成过程中的优化

  • 所有的模型能用Nanite就用Nanite,Nanite对Lumen的Surface cache的生成有很大的加速。
  • 在生成Surface cache的过程,每个模型都会有一套card来生成surface cache,我们可以把一组模型通过给它们设置同样的Ray Tracing Group Id的方式,这一组模型使用一套card来生成Surface cache。这对于模块化的场景,一栋大楼几千个模块拼装而成,这种方法优化的效能非常高。
    在这里插入图片描述

Lumen的反射

软件光线追踪

软件光线追踪下,近距离的反射比较清晰远距离比较模糊,这很好的说明了Lumen混合追踪的工作方式,近距离比较细的用的屏幕追踪(Screen Tracing),中距离追踪的是相对精细的网格距离场(mesh distance field),再远的距离就是全局距离场(global distance field
在这里插入图片描述

硬件光线追踪

要有更高的反射品质就要开启硬件光线追踪
在这里插入图片描述

如何提高硬件光线追踪的反射质量

  • 捕获小物体:调整后期处理盒子参数 Lumen Scene Detail
  • 捕获极小物体或自发光物体:启用物体选项 Emissive Light Source
  • 来提高光影质量:调整后期处理盒子参数 Lumen Scene Lighting Quality
  • 表面材质模糊:在后期处理盒子里提高Quality,将Ray Lighting Mode修改为Hit Lighting for Reffections

学习地址

地址