UE4-1-渲染总览(蒙特卡罗方法、可视性、GBuffer、反射、动态光照阴影、后期处理)
本文于2021年2月2日由AlvinCR更新
本文包括:渲染方法、蒙特卡罗方法、阴影算法、可视性、GBuffer、反射、动态光照阴影、后期处理。
本文由AlvinCR总结自官网教程:
https://learn.unrealengine.com/course
文章导引
一:基础知识
参考:WIKI
1 定义
在计算机图形学中,渲染是指用软件从模型中生成图像的过程。该模型是由语言或数据结构严格定义的3D对象或虚拟场景的描述,包括几何、视点、纹理、光照和阴影信息。图像是数字图像或位图图像。渲染用于描述:在视频编辑软件中计算效果,生成最终视频的输出过程。
2 渲染方法
跟踪场景中的每束光线是不现实的,需要花费大量的时间。如果没有使用好的约束条件进行采样,即使部分光线跟踪生成图像也需要很长的时间。因此,可以大致分为四类的更有效的光传输模型技术应运而生:
- 栅格化,包括扫描线绘制,它考虑到场景中的物体并将其投影到图像中,但缺乏一些先进的视觉效果;
- 光线投影,它从不同的角度观察场景,只根据几何和反射强度的基本光学原理计算观测到的图像,或者可以使用MonteCarlo方法来降低人工噪声。
- 辐射着色,它用有限元分析来模拟光在表面的散射;
- 光线追踪,类似于射线投影,但采用了更先进的光学模拟方法,而蒙特卡罗方法通常用来获得更多的真实结果,但这样做的成本往往大大降低了速度。
大多数先进的软件使用多种技术,在合理的开销范围内取得足够好的效果。
3 蒙特卡罗方法
3.1 方法
全称Monte Carlo method,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。
这个方法我们并不陌生,在AlvinCR高中和大学阶段就经常接触蒙特卡罗方法,虽然当时不知道叫这个名字,例如对π进行求值的时候,如果采用统计学上的方法进行处理,可以通过丢石子看有多少个石子落在园内,有多少个落在圆外的外接正方形中,从而统计出π。WIKI上的例子:使用蒙特卡罗方法估算π值. 放置30000个随机点后,π的估算值与真实值相差0.07%。
即蒙特卡罗方法的精髓在于用统计方法求出模型的数字特征,从而解决实际问题。
3.2 问题
在渲染的过程中使用蒙特卡洛光线追踪,通过将半球积分方程进行近似简化来实现加速的效果,相当于通过采样对光线进行模拟。
但是由于计算机产生的随机数是受到存储格式的限制的,是离散的,并不能产生连续的任意实数;因此将平面分割成一个个网格的做法,会使分割出的空间不连续,由此计算出来的面积实际面积有或多或少的差距。
4 阴影算法
原文:https://www.btbat.com/2123.html
4.1 传统的阴影算法:
游戏中传统的光照算法,是利用公式法来计算特定类型光源的直接光照在物体表面所产生的反射和漫反射颜色,然后再使用阴影算法做阴影补偿。标准的阴影算法不能计算面光源,改进以后的阴影算法通过对面光源采样,可以模拟出软阴影的效果。但是这些方法计算的光照都是来自直接光源的,忽略了光的传播过程,也就无法计算出由光的传播所产生的效果。通过特定的修正,我们也可以计算特定的反射折射或漫反射过程,但是无法给出一种通用并且物理正确的方法。目前游戏中大多是采用改进的阴影算法来进行渲染,它的优点是效率比较高,结合预计算的话,还是可以产生比较生动可信的效果。
4.2 传统的逆向光线追踪:
正如前面描述的那样,要想计算光能在场景中产生的颜色,最自然的考虑就是,从光源出发,正向跟踪每一根光线在场景中的传递过程,然后收集信息。然而这个想法在被提出的来的那个时代的计算机硬件上是不可能实现的,当时人们认为,正向光线追踪计算了大量对当前屏幕颜色不产生贡献的信息,而且它把看不见的物体也计算在内,极大的浪费了效率。于是人们想出的另一个方法是:只计算有用的,从人眼出发,逆向跟踪光线。
逆向光线追踪从视点出发,向投影屏幕发出光线,然后追踪这个光线的传递过程。如果这个光线经过若干次反射折射后打到了光源上,则认为该光线是有用的,递归的计算颜色,否则就抛弃它。很显然,这个过程是真实光线投射的逆过程,它同样会产生浪费(那些被抛弃的逆向光线),而且只适用于静态渲染。
4.3 AlvinCR总结:
传统的阴影算法计算出的光照都是直接来源于光源,忽视了光在传播过程中所发生的变化,在日常生活中光遇到物体会发生漫反射、折射、全反射等各种现象,并不是一成不变的,可是当前并没有计算光线变化的通用方法,就只能采用改进的阴影算法进行模拟,虽然效果相对较差,但是效率很高。
对一个事物如果反过来看待,也许会有更好的方法,逆光线追踪就是这样产生的,既然难以计算所有光传播中产生的各种效果,那我们就将好钢用在刀刃上,只计算影响最终效果最强的因子,从入眼光线着手,反推哪些光线比较重要,通过对重要的光线进行模拟,就能使得计算量大减,同时实际效果并不会减少很多。
二:流程
评价渲染工具的好坏参考:渲染质量、渲染功能及性能。
1 整体流程
AlvinCR认为渲染并不是一个具体步骤,而是与其相关的多个流程。
与渲染有关的一切都是使用r.rendering函数。
渲染的准备工作:
可视性(包括遮蔽)——>渲染——>基础通道(属于渲染过程,基础通道材质包含:几何体、绘制和调用、预计算光照)——>GBuffer(是一条基础通道,需要GBuffer是因为基础通道采用延迟渲染器)——>动态光照和阴影——>反射——>后期处理——>可拓展性及性能
2 具体过程
2.1 可视性
在渲染的之前,需要使用CPU进行计算,然后将需要渲染的帧提供给GPU,因此CPU必须在渲染前一帧之前完成相关计算,因为使用CPU可以明确物体的存在方式、位置及是否需要渲染。
功能:
距离剔除。超出距离限制的物品将会禁用,默认开启
视锥剔除。用于识别镜头内外需要渲染的对象
预计算可视性。适用于移动设备、低端设备
可视化剔除。核心单元,上面三项都是为可视化剔除工作,能够实现的基础在于:每个网格体都能准确隐藏和包含它背后的对象,因此能够使大部分遮蔽准确地识别。
2.2 渲染
渲染包括:Z通道和基础通道。Z通道作用:渲染景深;基础通道作用:渲染几何体的所有部分,会在渲染时逐一处理每个绘制调用。因此渲染的重点在于基础通道。
基础通道最主要的实现在于:绘制调用、基础通道材质(包括光照贴图)、动态实例化。
GBuffer
GBuffer是基础通道的一部分,下面简称GB,GB能够将自己渲染成同一画面的不同版本,通过GB的渲染可以得到:世界法线(缓冲A)、高光度和粗糙度以及金属度(缓冲B)、底色及光照(缓冲C)、其它Buffer(缓冲D、E等等)
这些缓存是由各个图像保存后得到的,可以设置其他延迟渲染。中间显示的图片是由四周的各个缓存整合得到的最终效果图,因此可以对已渲染的版本进行其它渲染操作。
2.3 动态光照阴影
通过动态光照阴影组合可以实现渲染阴影的效果,由于室内和室外的阴影渲染很难采用同一种方案进行,因此需要根据情况来采用不同的解决方法
直接光照。间接光照、介于光照与阴影、光照和阴影
www.alvincr.com
2.3.1 影响光照的因素
直接影响
- IES纹理用于得到更加逼真得光照效果,详情看附录
- 光照函数。支持使用材质与光照混合,可以用于生成水火的效果,还能实现云在地上的阴影效果。
间接影响
- 光照传播系统。过时程序,用于提供实时全局光照。
- 光追GI,目前并不常用
2.3.2 影响阴影的因素
直接影响:
- 法线动态阴影,默认使用缓存生成阴影缓存
- 级联阴影贴图,是三种不同的阴影贴图采用级联方式进行合并,将阴影分成低、中、高三种质量,能够在不同距离进行显示,因此专用于室外环境,
- 距离场阴影。由于阴影渲染必须考虑阴影的几何体贴图,因此会占用大量的资源,但是如果不考虑几何体本身,而是通过对阴影进行预测,那么渲染的速度会大幅提升。通过Mesh DistanceFiled函数可以视点与物体之间的距离,将网格体距离场信息存储在内存中,因此可以提升长时间运行的效率。虽然距离并不是很准确,但是用于远距离阴影足矣,这样就可以设置非常远的阴影了,不过不能用于骨骼网格体。
- 光追阴影。既可以单独使用,也可以混合使用。
- 嵌入式阴影。用于提升角色展示效果。
- 各对象本身阴影。用于提升角色展示效果。
- 接触阴影。用于产生细小的阴影。
间接影响:
- 胶囊体阴影。属于大幅简化的阴影,适用于所有骨骼网格体,因此对于生成大量单位的阴影并且阴影要求不高的时候,具有很好的效果。
- 距离场环境光遮蔽DFAO。适用于非常大并且非常重要的对象,对于精细的对象效果并不好,主要适用于天空光照等室外环境。它使用世界场景中的距离场网格体来给环境光遮蔽着色。
- 光追AO。
2.4 反射
采用堆叠设置方式,从而最大限度减少开销最高的效果。
反射捕获-》平面反射-》
- 反射捕获,性能开销最低,捕获的信息存储在硬盘中,因此可以在世界场景中放置大量的反射捕获。
- 平面反射。精度偏低,性能开销较大,只适用于完全平整的表面,例如地板。墙壁、金属表面并不适合。
- 屏幕空间反射。可以随时调整质量。
- 光追反射。
2.5 其它设置
可以设置天空和大气、指数高度雾和大气雾。
雾:
- 高度雾。用于设置远处和高处雾的淡出效果。
- 大气雾。
- 远距离雾。
- 指数高度雾。可以用来处理体积雾,会读取光照贴图及其设置,用于渲染
- 体积材质。
半透明:
- 材质:设置混合模式和着色模型。
- 半透明度:可以设置屏幕空间反射、光照模式、。其中光照模式主要使用:体积无方向、逐顶点体积无方向、表面向前着色(效果最好,开销最大)。
2.6 后期处理
- 标准色调映射器。执行色调映射实现颜色校正、色调校正、对比度校正。
- 泛光。包括:标准反光、卷积设置(游戏中默认不用,因为性能开销较大)
- 屏幕空间AO,SSAO。
- SSSSS,屏幕空间次表面散射。通常用于皮肤的屏幕空间特效,主要适用于人,树叶也可以。
- SSGI,屏幕空间GI。在整个屏幕空间内实现近似全局光照的效果。
- 景深。包括:高斯景深(用于游戏,效果较差,性能较好)、散射景深、圆形或过场动画景深。
- 曝光度。
- 可混合物。可以使用材质编辑器来进行后期处理,以此来实现各种特效效果。属于内置特效,因此包含在引擎之中,通过可混合物可以启用:粒子、晕映、镜头炫光、尘土遮罩、色差
2.7 性能
主要设置CVar
三:其它
- 统计数据面板。可以合并网格体
- 细节模式。
- 远阴影。类似于远处消退的级联影影贴图。
- 光照范围。可以设置最大绘制距离,还可以生成蓝图去检测距离。
- 材质开销。
- 半透明度。半透明材质的指数十分影响性能,因此在设置材质时应尽可能的关注。使用体积无方向进行测试的速度最快,但是显示的阴影十分模糊。
- 烘焙光照。
附
IES纹理
原文:https://docs.unrealengine.com/zh-CN/BuildingWorlds/LightingAndShadows/IESLightProfiles/index.html
照明工程学会(IES)定义了一种文件格式,以使用真实世界测量数据描述光源的光照分布。此类IES光度文件或 **IES描述文件**是一类照明行业标准方法,对特定真实照明灯具散发出光线亮度和光线衰减进行图解。其可使光照考虑灯具的反光表面、灯泡的形状以及发生的透镜效应。此类光度照明主要运用于企业领域(如媒体和娱乐或建筑和制造),但也常在游戏制作中用于获取逼真的光照效果。
在虚幻引擎4(UE4)中,IES光源描述文件是1D纹理(梯度)。但其实际并非纹理文件。曲线以弧形定义光强度,该弧形”扫过”轴,并根据提供的真实世界数据,使点光源、聚光源和矩形光源投射逼真光线。此曲线的工作原理与光总亮度的乘数类似,例如从光源投射纹理时,不会产生使用纹理的开销,也不会在某些角度发生错误。
AlvinCR总结:IES纹理主要用于得到更加逼真得光照效果,其中IES文件存储光源的方向强度分布图。此外IES纹理不是法线纹理。
骨架网格体
原文:https://docs.unrealengine.com/zh-CN/WorkingWithContent/Types/SkeletalMeshes/index.html
架网格体由两部分构成:构成骨架网格体表面的一组多边形,用于是使多边形顶点产生动画的一组层次化的关联骨骼。
在虚幻引擎 4 中,通常使用骨架网格体代表角色或其他带动画的对象。3D 模型、绑定及动画都是在外部建模和动画应用程序(3DSMax、Maya、Softimage 等)中创建的,然后通过虚幻编辑器的内容浏览器把这些资源导入到虚幻引擎 4,并将其保存到包中。
屏幕空间反射SSR
利用已有的渲染信息,然后显示在反射效果中,因此反射已经被渲染的画面。