Unity、UE初学者笔记——实时渲染光影部分
Kerry佬的教程讲片元着色器的时候提到了光照和阴影,但只是简单介绍了比较基础的光照模型。大概是因为前向渲染不管直接光照间接光照都一起完成了,所以也没详细介绍。
UE教程:中文版较新,很多新功能都有介绍。
反射有多种不同方案,各有优缺点。
1.反射捕获。
静态的Cubemap,不精确。只是在固定范围内拥有局部效果。如果无法从反射捕获中获取反射信息,都会使用天空光照反射。Unity里的反射探针。
2.平面反射。
只适用平滑需要精确反射的表面(例如镜子),完全动态,性能损耗较大,不常用。Unity是镜面反射探针。
3.屏幕空间反射SSR。
默认开启,反射所有对象,并且实时反射,只反射当前可见内容。很精确,但有噪点,并损耗大。Unity应该一样。
4.Lumen
全动态全局光照和反射系统。Unity也支持光追,但有没有Lumen那么强大的功能不清楚。
5.RT Reflection
UE除了静态光源、可移动光源,还有固定光源(Stationary Lights)。固定光源是指位置固定不变,但可以在其他方面变更(如颜色、亮度等)的光源。在运行时对亮度进行修改仅会影响直接光照,间接光照由于是通过Lightmass进行预计算的,所以不会改变。
静态光照和阴影
虚幻引擎中有数十种不同的光照和阴影方案。光影实时计算很困难,也就需要部分光影在预计算阶段完成,运行时与实时光照结合。
Lightmass是一个独立程序,由引擎编辑器在烘焙时调用,支持网络分布式渲染。渲染质量可以通过一些选项设置。
间接光照缓存(Indirect Lighting Cache,ILC),也就是Unity中的光照探针。
静态光影的性能
在编辑器下预先计算,并将信息存储在Lightmap中。
计算非常高效,但占用更多内存。
需要一定的时间去预计算。
每次修改光照和静态物体,需要重新构建光照。
模型需要Lightmap UV,因此需要额外的步骤去处理。
静态光影质量
可以处理辐射和全局光照。
真时的阴影效果包括软阴影。
质量取决于Lightmap的分辨率和UV分布。
由于UV布局的关系,光照还可能显示出接缝。
Lightmap分辨率有上限,巨大的模型可能效果不佳。
一旦烘焙完成,在运行时静态的光源和物体无法移动。
动态光照和阴影
动态光影借助G-Buffer实现实时渲染。光源可以随意改变,移动、添加或删除。它不需要准备任何特殊模型就能产生效果,然而阴影对性能的影响非常大。渲染动态阴影有多种方法,这意味着需要时间和实践才能找到合适的方法和混合方案。使用静态光影只需放置光源,不会面临那么多选择。
动态阴影的类型:
RDS常规动态阴影Regular Dynamic Shadows。
POS逐个对象阴影Per Object Shadows,或称为固定光源阴影Stationary Light Shadows。阴影要比RDS柔和。
CSM级联阴影贴图Cascaded Shadow Maps,只能用于定向光源。将视锥体分割,离相机近的阴影分辨率较高。
DFS距离场阴影Distance Field Shadow,处理长距离范围,可以生成软阴影,不精确但损耗低。
1.由于需要直接光照,光源需要是固定或可移动光源
2.只对静态网格体有效,需要离线生成Mesh Distance Field
3.CSM>DFS>Traditional Shadow
4.运行时生成Global Distance Field
5.Ray Marching
Inset Shadows插图阴影,Contact Shadows接触阴影,Capsule Shadows胶囊体阴影,本质上与逐个对象阴影相同。
阴影的性能消耗更大,通常需要降低渲染质量来补偿。动态光影不会对大部分内容产生辐射或全局光照。不会产生“真正的”软阴影。阴影贴图分辨率不够会导致阴影失真,锯齿严重。动态阴影通常看上去更清晰锐利更具现场感,不太需要考虑模型大小。
动态光照
使用像素着色器计算。点光源像球体一样渲染,原理就像遮罩。球体内的任何像素都会进行着色运算来混合光照。方向光对全屏幕像素进行渲染。
如果光源离相机非常近,投影会占比较大的画面,但又没照亮非常多物体,这就需要光照剔除。常用的两种剔除方式Tile和Cluster。
Lumen
UE5才有的全动态全局光照和反射系统,阴影配合最新的虚拟阴影贴图VSM。
Color blending
被照物体表面颜色影响到周围表面的颜色。
Soft indirect shadow
间接软阴影能让没有受到直接光照的物体投下阴影。取代了UE4 的SSAO,提供了精确且柔和的阴影。
Multi-bounce indirect illumination
通过追踪前几帧的光照来计算当前帧的光照,这意味着光照结果是当前帧和前几帧混合在一起的结果,有了辐射度的效果。
其实这里的讲解顺序我是很奇怪的,因为是渲染课程,不讲光源讲光照阴影我理解,但为啥先介绍反射,尤其这个反射貌似不是漫反射也不像高光反射,像是全镜面反射、环境光,是间接光照,为啥不先介绍直接光照。
之后的内容不多,都放这儿吧~
半透明
延迟渲染管线难以处理半透明材质,在渲染流程的后半段进行,使用前向渲染管线渲染半透明物体。
之所以很难实现,是因为你只有G-Buffer可用,它缺乏足够信息,不能给你足够的材质来正确渲染透明度。
英文版有提到雾效,不知道为什么中文版完全省略了。新版本不一样了?
英文版最后讲到没涉及的部分:表面渲染、折射、位移贴图、屏幕空间环境光遮蔽、交互界面和UI元素和贴花等等。
后处理
霜狼课程也简单介绍了一下,UE的中文版教程感觉描述得也很简略,英文版稍微详细些。不过中文版的例子很有趣。
后期处理很大程度上依赖像素着色器,通过合成实现。
通过再度使用G-Buffer的内容来计算各种效果。
常见的后期处理特效有:泛光、景深、其他形式的模糊效果(具体类型取决镜头眩光的实现方式)、光束、虚光效果、色调映射/颜色分级、曝光、运动模糊、眩光。
实时Ray Tracing
嗯,感觉和没说一样。
性能调试Profiling
也是一带而过。
Stat命令
GPU Visualizer
Unreal Insight
Frontend Session
中文版增加最后这两部分,结果也没多介绍。