虚幻引擎的实时渲染概述(下)
反射
实时渲染中反射是一个非常有挑战的特性
UE中有多种不同的方案,各有各的优势和缺点
- 反射捕获
- 屏幕空间反射
- 平面反射
- Lumen
- RT Reflection
反射捕获
- 在指定位置捕获一张Cubemap
- 需要预计算
- 快速
- 不精确
- 只能捕获一定距离范围内的物体
平面反射
- 并不常见,也不常常使用,仅限在指定平面上
- 在某些设置下可能会有很大的性能损耗(每帧捕获)
- 适合需要精准反射的表面(例如镜子)
屏幕空间反射
- 默认开启的反射系统
- 对任何物体都有影响
- 准确
- 输出有噪声,性能损耗较大
- 只反射视野范围内可见的物体
反射性能提示
- 如果未经过Cook,反射捕获会在打开关卡时进行,导致加载变慢
- 反射捕获区域如果有很多重叠,会导致多次着色从而性能变差
- 反射捕获的分辨率可以在系统设置中调节
- 天空光为整个关卡提供了低成本的反射捕获
- 必要时才使用平面反射的实时捕获和SSR
光照
- 静态光源(Static Light)
是指在运行时不能以任何方式改变或移动的光源,它们仅在关照贴图中进行计算,一旦处理完成后,不会再有进一步的性能影响。可移动对象不能和静态光源进行交互,所以静态光源的用处是非常有限的。
- 可移动光源(Moveable Lights)
产生完全动态的光照和阴影,可以改变光源位置;旋转度,颜色,亮度,衰减,半径等属性;几乎光源的任何属性都可以修改。它们产生的光照不会烘焙到黄照贴图中,也不会产生间接光照效果。
- 固定光源(Stationary Lights)
保持固定位置不变的光源,但可以在其他方面进行变更,例如可以在其他方面进行变更,例如亮度和颜色。这是它们与静态光源的主要不同之处,静态光源无法在游戏时以任何方式进行变更。然而,应该注意的是,在运行时对亮度进行修改仅会影响直接光照。间接(反射)光照由于是通过Lightmass进行预计算的,所以不会改变。
静态光照和阴影
- 与反射一样,光照和阴影在实时计算也很困难
- 部分光照,阴影的计算会在预计算阶段完成,在runtime与实时光照结合
- 虚幻引擎中有数十种不同的光照和阴影方案
静态光照主要通过Lightmap来实现的,Lightmap是一张烘焙了光照和阴影的贴图在计算时与BaseColor相乘
UE4中,我们使用Lightmass工具生成Lightmap
多张Lightmap会合并到atlas中可以逐个mesh调整Lightmap密度
Volumetric Lightmap
Lightmass会生成表面光照贴图,用于表现静态对象上的间接光照。但是,动态的对象(例如角色)也需要一种接受间接光照的方法这种方法就是在构建时将所有点的预计算光照存储在名为体积光照贴图的空间中,然后在运行时用于动态对象的间接光照的插值。
质量
- 可以处理辐射和全局光照
- 真实的阴影效果包括软阴影
- 质量取决于Lightmap的分辨率和UV分布
- 由于UV布局的关系,光照还可能显示出接缝
- Lightmap分辨率有上限,巨大的模型可能效果不佳
- 一旦烘焙完成,在运行时静态的光源和物体无法移动
性能
- 在编辑器下预先计算,并将信息储存在Lightmap中
- 计算非常高效,但占用更多内存
- 需要一定的时间去预计算
- 每次修改光照和静态物体,需要重新构建光照
- 模型需要Lightmap UV,因此需要额外的步骤去处理
Lightmass
- Lightmass是一个独立程序,由引擎编辑器在烘焙时调用
- 支持网络分布式渲染
- 渲染质量可以通过一些选项设置
GPU Lightmass
- GPULM大大减少计算,构建和生成复杂场景光照数据所需的时间,其速度可与基于CPU的Lightmass使用Swarm进行分布式构建时的速度相媲美。此外,GPULM提供具有交互性的新工作流,可以实时编辑场景,重新计算和重新构建光照。基于CPU的Lightmass系统无法使用此工作流。
静态光照的性能提示
- 静态光照总是以完全相同的速度渲染
- 无论有多少静态光源,烘焙之后的渲染速度是一样的
- Lightmap分辨率会影响内存,但不影响帧率
- 烘焙速度会受以下几点影响
- Lightmap分辨率
- 模型,光源数量
- 烘焙选项
- 光照影响范围
动态光照和阴影
动态阴影
- 常规动态阴影
- 级联阴影
- 逐对象阴影
- 距离场阴影
阴影是光线阻挡的效果
- 常规动态阴影——阴影非常锐利
-
Shadow Acne
阴影失真是由于阴影贴图的分辨率不够造成的
-
级联阴影——方向光,不同距离
- 阴影贴图的分辨率低,锯齿严重
- 视锥体分割
-
逐对象阴影——固定光源(位置固定,颜色,光强可变)
- 针对可移动物体
-
距离场阴影——可以生成软阴影,不需要针对模型运行阴影pass
- 从空间中待着色的点出发,沿着光线方向前进。
- 由于需要直接光照,光源需是固定或可移动光源
- 只是对静态网络体有效,需离线生成Mesh Distance Field(ue4默认关闭,ue5默认打开)
- CSM>DFS>Traditonal Shadow
- 运行实时生成Global Distance Field
- Ray Marching
- 从空间中待着色的点出发,沿着光线方向前进。
其它阴影:
- Contact Shadow——对于小的物体有较好的细节
- Capsule Shadow——用简化的模型来渲染阴影
动态阴影的性能提示
- 渲染阴影的性能损耗大,通常需要降低渲染质量来补偿
- 动态光照不会对大部分的内容产生辐射或全局光照
- 动态光照不会生成“真正的”软阴影,只是通过模拟软阴影来实现
- 动态光照在场景中看起来更"真实"(闪烁等,光线非常锐利)
光照渲染
- 使用像素着色器计算
- 点光源用一个球型模型来渲染
- 在球投影内像素会进行光照渲染
动态光照性能提示
- 动态光照在延迟渲染中性能损耗相对少,但在前向渲染中损耗非常大
- 像素越多性能越慢
- 光源离相机近,受影响的像素越多,性能也就越慢
- 点光源半径需要尽可能小,避免重叠
Lumen和VSM
Lumen
- Lumen是虚幻引擎5全新的全动态全局光照和反射系统
- Lumen使用了多种光线追踪方法来处理全局光照和反射
半透明
- 延迟渲染管线难以处理半透明材质
- 半透明渲染在渲染流程后半段
- 使用前向渲染管线渲染半透明物体
- 渲染半透明材质的对性能影响很大
- 像素被多层半透明材质覆盖,性能损耗很大
- 渲染排序也会增加性能损耗
后期处理
- 后期处理很大程度上依赖于像素着色器,通过合成实现
- 通过再度使用G-Buffer的内容来计算各种效果
- Bloom(泛光)
- DOF(景深)
- Lensflare(炫光)
- Vignette (晕光)
- Tonemapping (色调映射)
- Motion Blur(运动模糊)
- Exposure(曝光)
实时Ray Tracing
Ray Tracing☞追踪从摄像机出发的光线在场景里多次反弹的一个过程
性能调试
- Stat命令
- GPU Visualizer
- Unreal Insight
- Frontend session
性能调试首先得找到瓶颈 stat unit
可以看到不同线程执行的速率
对于GPU可以通过GPU Visualizer ctrl+shift+,
打开
Unreal Insight是一个独立的可执行程序,可以帮助开发者识别瓶颈,用于性能优化,还可以用于收集,分析和显示引擎发出的数据。另外Unreal Insight可以轻松添加用户自己的分析数据,它对项目的执行的影响非常低