光照基础
四种基本光照Actor
SkyLight是一种特殊的光照:采集一张天空360度全景图(立方体贴图cubemap),读取贴图颜色信息后设置天空光照,然后投射回场景。用于模拟天空大气的散射光照
光照可移动性设置极其重要
决定将那些光照烘焙进静态贴图,哪些实时渲染
静态 --- 烘焙,预计算,运行时无法更改任何光照属性。运行时性能开销最低
固定(半静态)--- 保持固定位置不变的光源,但可以改变光源的亮度和颜色等,如果在运行时更改亮度仅影响直接光照。间接(反射)光照不会改变,因为它是在Lightmass中预先计算的(固定光源只烘焙间接光照,其余部分动态投射)。在三种光源的可移动性中,固定光源具有最好的质量、中等的可变性,以及中等的性能消耗
可移动 --- 实时渲染,投射完全动态的光照和阴影,可修改位置、旋转、颜色、亮度、衰减、半径等所有属性。其投射的光照不会烘焙到光照贴图中,不支持间接光照。性能开销最大
静态光照与烘焙
可移动性设置为静态或固定的光源,静态(烘焙)光照通常质量最好,支持全局光照、辐射和光照反射
烘焙结果是一系列全局的光照纹理贴图(lightmaps),集成进万个光照纹理UV,烘焙时间取决于设置,一般开始慢,后面会越来越快
有光源修改或移动后都需要重新烘焙,但是运行时效率极高,仅影响内存读取性能
lightmass是一个独立负责烘焙的程序,组建多个swarm agent可以分布式烘焙
烘焙主要的几处设置:
build - lighting quality
世界设置 - lightmass全局设置
lightmass重要体积 :覆盖高质量光照区域,避免渲染远处或不重要区域。体积不用太精确
lightmass portal:帮助天空和大气层的光线反射进室内场景,常用于窗户,门等区域。同样体积不用太精确
每个静态模型需要准备用于烘焙的光照贴图UV坐标,导入时会自动生成,静态网格体里欧也能找到对应选项,可以生成新的UV:确认UV不要有任何重叠,孤岛不能出现翻转
静态网格体Details - General Settings设置该模型的UV通道和贴图分辨率, UV通道第二个(Index 1)通道是用于光照UV的独立通道,第一个是源UV
关于动态模型获取静态光照信息
Indirect Lighting Cache(ILC):烘焙产生间接光照网格体积,动态模型运行时会获取最近点的间接光照信息,4.18版本后采用体积光照贴图替代ILC用于缓存网格点,原理一样
可视化:展示(Show)->显示(Visualize)->体积光照样本(Volume Lighting Samples)
动态光照
可移动性设置为可移动的光源,可以运行时修改或生成动态光源,可以蓝图控制,最大缺点是不支持间接(反射)光照,且性能开销大
动态光源的开销主要在动态阴影,特点是阴影极其锐利甚至不太真实
固定光源兼具静态和动态的优点,同一个区域内的固定光源有通道数限制,保证烘焙后无固定光源报错
室外场景需要处理远处动态阴影的性能问题
级联阴影贴图(CSM)
随距离等级替换低分辨率阴影,Cascaded shadow Maps - Num Dynamic Shadow:该值决定分级数
Cascaded shadow Maps - Dynamic Shadow Distance:该值越低随距离降低越快,但是阴影更清晰
距离场阴影
不会默认开启,项目设置启用,一旦开启,给每个静态模型产生一个距离场网格体
距离场是对模型生成一个近似模拟的纹理而不是几何体本身,非常不精确,但是极大提升远景阴影的渲染效率,可视化:
show - visualize - mesh distance fields
室外场景常常混合使用CSM和距离场:当距离较近时使用CSM阴影贴图,阴影较为清晰,随着距离变远,更远处的阴影会使用距离场阴影
动态光源细节面板设置:Distance Field Shadows, 可以勾选是否使用光线追踪和距离场距离
距离场环境光遮蔽(DFAO)
由天空光源产生,由距离场网格体模拟光线反射和环境光遮蔽效果,但由于距离场网格体本身不精确,所以有时效果不好,可以在不同场景尝试使用
SkyLight细节面板设置:Distance Field Ambient Occlusion
可移动光源的阴影修复:使用 倾斜偏差(Shadow Bias)和 阴影倾斜偏差(Shadow Slope Bias) 属性,调整 阴影倾斜偏差 与 阴影偏差 成正比,在这两个属性间可减少发生阴影映射瑕疵,但会降低阴影精度
可移动光源的阴影贴图缓存:点光源或聚光源未移动时,可存储该光源的阴影贴图并在下一帧重复使用。在环境通常不移动的游戏中,此功能可显著降低可移动点光源和聚光源的阴影投射开销
选中所有动态光源,r.Shadow.CacheWholeSceneShadows 1启用
Stat Shadowrendering 查看动态阴影当前开销
可使用 r.Shadow.WholeSceneShadowCacheMb 控制阴影贴图缓存使用的最大内存量
阴影贴图缓存大幅度提升动态阴影开销,但是有些限制:
关卡中使用的材质不能使用 场景位置偏移
光源必须是 点光源 或 聚光源,移动性 设为 可移动,并启用 阴影投射(cast shadows)
使用动画 曲面细分 或 像素深度偏移 的材质可能会在缓存其阴影深度时产生瑕疵
动态光照不能产生间接光照,有一种光线传播体积(LPV)技术可以让动态光照快速获得间接光照效果而不用烘焙获得(实验性质技术)
-----(2021/5/26更新!UE5来啦,Lumen动态全局光照,间接光照!实时渲染!UE5 niubi~)
结合使用静态光照和动态光照
天空光照 --- 通常设置为静态,降低Sky Distance Threshold便于更好采集远处的光照
定向光源 --- 通常设置为固定,启用CSM(距离5000)和距离场(距离30000);若需要太阳光随时间移动效果,则设置为可移动
室内光源 --- 点光源或聚光灯,为了兼具静动效果通常设置为固定;如果需要蓝图控制某个光源开关设置为可移动
静态光照烘焙时注意每个模型的光照UV分辨率不要太高,保证内存足够,只有体积巨大的模型才需要高分辨率
项目设置(Project Settings)> 引擎(Engine)> 渲染(Rendering) 中的 光照(Lighting) 类别下,启用 屏幕空间全局照明(Screen Space Global Illumination)能进一步改善间接光照质量
控制台设置质量等级(1-4):r.SSGI.Quality
HalfRes命令,用于以一半分辨率渲染SSGI:r.SSGI.HalfRes
无泄漏项目使用上一帧的场景颜色来获得更好的质量效果:r.SSGI.MinimumLuminance
建议该技术和全局lightmass结合使用
光照特效
调整光源源半径(source radius)和源长度(source length)
配合调整源半径和长度可以改变点光源的形状,如日光灯的管形光源效果
静态光源的 光源半径(Source Radius)拥有柔化自身投射阴影的额外效果,光源半径越小投射的阴影锐度越高,反之越柔和
使用IES
IES常用于聚光灯,投射不同形状、亮度层次的光带
可移动类型一般为固定或可移动
使用光照函数
光照函数结合材质和光照产生效果
材质域:light function
如水底焦散效果: UV坐标 + 平移panner节点 + 水底焦散纹理 + 主材质emissive属性
其他典型应用场景:火焰跳跃光照效果, 云层滚动阴影变换
对光源细节面板的光照函数指定light function材质
限制:光照函数不能修改颜色,只有在启用投射阴影时才能工作
反射
三种反射类型:反射捕获,SSR,平面反射
默认启用的反射类型:屏幕空间反射SSR,实时渲染,精确,只能反射屏幕上的内容且噪点多,在某些视角下会消失
通常结合反射捕获使用:反射捕获噪点小但非实时渲染。对于反射效果要求高的区域单独加反射捕获球,但SSR优先级更高,引擎会自动切换使用两种反射
project - 搜索reflection - 设置reflection capture resolution分辨率,分辨率越大占用内存越大
平面反射:只使用于平整表面反射,如镜子。细节面板有参数capture every frame能实时反射,但是性能开销非常大,一般关闭
需要启用一项设置:project - 搜索global - 启用support global clip plane for Planar Reflections
一种特殊的反射处理方法:使用场景捕获(scene capture cube)捕获一张cubemap,用于其他材质实现反射效果
雾和立体光源
大气雾:勾选使用定向光源作为太阳光(新版引擎有天空大气Actor)
指数级高度雾:全局影响,即是距离雾也是高度雾,可以调整浓度等参数,与光束遮蔽&光晕配合使用产生光束穿过雾气的效果,最重要的是支持体积雾
启用体积雾:可以对浓度、颜色等进行设置(通常配合聚光灯光源实现体积光效果)
光源关联参数1 - 体积散射强度:接受体积雾对光源散射的影响程度
光源关联参数2 - 投射体积阴影 :启用后点光源和聚光源的开销约为不投射阴影的点光源和聚光源的开销的三倍
限制:
无法在点光源和聚光源上使用IES配置文件和光源函数
无法在点光源和聚光源上使用源半径(Source Radius)
光束遮蔽:光束穿过雾气产生深色的光线,通常和光晕结合使用模拟真实的光束效果
光晕:与光束遮蔽相反,光束穿过雾气产生明亮的光线,可以修改光晕颜色
全局烘焙ligthmass进阶
烘焙全局光照check list
全局烘焙步骤
对每个模型进行上述check list核对,检查光照UV等设置
在场景设置lightmass importance volume和lightmass portal
世界场景设置 - 设置lightmass全局参数
build选择关照质量级别 - build light only
迭代lightmass时,最好关闭自动曝光,禁用后期处理效果,show使用仅光照模式,便于观察仅lightmass光照贴图产生的效果
lightmass参数设置:
Static Lighting Level Scale(下文简称SLLS),世界尺寸缩放,这里的缩放指的用于计算光照的参考尺寸,而不是真正的改变场景尺寸,默认为1,可以小到0.1。重点参数,越小计算采样的基础精度(采样数上升)越高,中小场景0.2·0.3, 大场景1-4。计算时间受该参数强烈影响
Num Indirect Lighting Bounce(下文简称NILB),反弹次数,对计算时间影响不大,越高GI反弹次数越多,同时如果精度不够,也意味着噪点将会更容易产生。一般取值30-60,可以大到100。非重点参数,还有个skylight类似参数
Indirect Lighting Quality(下文简称ILQ),间接光计算质量,默认值1,可以大到10,重点参数,对精度影响巨大,计算时间也和这个值成整倍数上升
Indirect Lighting Smoothness(下文简称ILS), 结果模糊度,用于模糊计算结果,平滑噪点,基本保持0.6-1的值,过大细节丢失,过小噪点凸显
use Ambient Occlusion:开启环境光遮蔽技术(注意:非距离场网格体模拟的DFAO,而是真正的SSAO),后期盒子可以对该项后期调整
lightmass有一个特殊功能:将网格体的纹理对象烘焙成自发光光源并对周围环境影响,比如让发光的电视机照亮房间,需要将纹理接入材质的emissive属性,设置材质为无光照,并在网格体细节面板开启
需要重新烘焙成光照贴图后生效,这种方法常用于营造室内氛围
其他光照技巧
使用persist level + 蓝图load stream level/unload stream level实现白天夜晚场景切换
使用时间轴 或 光照函数实现闪烁光 & 光照纹理
使用cable actor(线)连接点光源, 实现摆动灯效果
用capture camera为skylight采集cubemap,使用cubemap的颜色信息替代自动采集
使用胶囊阴影为动态角色创建更柔和的阴影效果
使用lightmass网格体自发光+ 源长度控制 实现不同形状的荧光灯效果
配合后期盒子实现全局光照效果调整
警报灯效果:两个反向聚光灯自旋转,冷色+暖色对比
聚光灯启用体积雾效果,模拟天窗洞穴等体积效果,烘托氛围
使用不同的色温模拟真实光源,如钨光灯的色温为3100
关于体积雾的设置
地图中需要有指数级高度雾(全地图有效),并启用体积雾和相关设置
高度雾有两级,互不影响,室内体积雾设置第二级Second Fog Data
设置启用体积雾volumetric Fog,散射Scattering Distribution, 可见距离view distance
设置体积雾颜色Emissvie,静态光散射强度static lighting scattering intensity
光源设置(点光源、聚光灯、方向光)
设置stationary
设置Volumetric Scattering Intensity
设置是否cast volumetric shadows (非光源本身的阴影,限制条件见前面笔记-雾和立体光源部分)
解决光源错误,多个光源投射重叠可能出现阴影投射问题,显示红叉错误,解决办法:
设置为static (影响体积雾效果)
或取消该光源的cast shadows(大多数点光源和聚光灯为节省性能,是可以关闭阴影的)