xiaoji1543 发表于 2024-7-15 18:45

Unity中的衬着路径RenderingPath

在进行游戏场景的光照计算时,需要考虑到三个方面的因素:光源数据、模型概况材质布局和不雅察看标的目的。今天主要来探讨光源数据对光照计算的影响。
光源数据

这里说的光源数据,主要包罗光源标的目的、衰减范围以及光源颜色。在Unity中,这些光源数据的传递是通过RenderingPath衬着路径来决定的。这个属性,在camera属性面板中可以找到。



renderingPath的设置

RenderingPath主要分为前向衬着(Forword)和延迟衬着(Deferred),Unity内置衬着管线Built-in 和URP衬着管线都属于前向衬着,而它的高清衬着管线HDRP、还有UE4默认采用的衬着管线属于延迟衬着。这两种衬着路径有什么样的区别呢?



衬着路径分类

前向衬着路径(Forward Rendering Path)

每进行一次完整的前向衬着,我们都需要衬着该对象的衬着图元,并计算颜色缓冲区和深度缓冲区的信息,操作深度缓冲来决定一个图元是否可见,如果可见,就更新颜色缓冲区中的颜色值。
前向衬着是一种逐像素光源的计算。如果一个物体受多个光源的影响,那么这个物体就会执行多个Pass,每个Pass城市计算一个光源的光照效果,然后在帧缓冲中把这些光照效果混合起来得到最终的颜色值。
前向衬着的Pass有两个:一个是ForwardBase,它主要用来计算主标的目的灯、逐像素的平行光以及所有逐顶点个SH光源,它可以实现光照纹理、环境光、自发光、暗影等光照效果。
主标的目的灯是通过设置光源的Render Mode属性来控制的,如果光源设置为important,那么就代表这个光源是主标的目的等。如果不设置,Unity会按照场景中光源的强度(Intensity)属性来自主决定哪个光源是主标的目的灯。



设置主光源

此外,逐像素光源的计算复杂度,和场景中物体、光源数量都有关系,假如场景中有N个物体,M个光源,那么光照计算的复杂度就为N * M。因此,合理地控制光源数量有利于减少光照计算的复杂度、提高法式性能。前向路径衬着默认的光源数量为4个,可以在Edit - Project Settings - Quality - Pixel Light Count中灵活调整数量。



设置光源数量

光源衬着模式和光源数量的设置,直接决定了光照措置模式,Unity是按照以下的判断法则来措置光照的:

[*]场景中的主光源总是按照逐像素措置;
[*]衬着模式为Important的光源,也会按照逐像素措置;
[*]如果光源设置为Not Important,又或者场景的光源数量超过了设置的值,那么城市按照注逐顶点或者SH来措置。
结合分析东西Frame Debugger来查看一下前向衬着路径的衬着过程。



前向衬着路径的衬着过程

可以看到,Unity首先衬着的是场景中物体的灰度图,然后每个物体的光照城市不竭地衬着叠加混合。从这里可以看出,光照信息并不是一次就会衬着完毕的,而是每个物体的光照城市反复衬着,最后再混合。
衬着过程中,有些光照信息是先被衬着的,但是效果并不是很抱负,这些先被衬着的光照信息往往是因为场景中光源数量超过了预设的光源数量值,而被逐顶点计算措置了。要想实现更好的效果,可以适当增大预设的逐像素光源数量。



逐顶点光照措置

前向衬着的此外一个Pass为ForwardAdd,逐像素光源数量范围内的灯光计算,城市调用一次这个Pass来进行计算,计算后的成果再通过Blend One One的混合模式叠加起来。
延迟衬着路径(Deferred Rendering Path)

前向衬着存在的一个问题就是:当场景中包含大量实时光源时,每个光源都可能会被反复衬着多次,这就会造成法式性能急速下降。而延迟衬着就斗劲好地解决了这个问题,它充实操作了一个GBuffer的东西,将物体衬着的一些基本信息(比如法线、位置、深度、光照计算的材质属性等),都事先存储了起来,从而避免了大量的反复衬着计算。
延迟衬着也是主要通过使用两个Pass来实现的。
第一个Pass用来计算那些片元是可见的,这主要通过深度缓冲技术来实现,如果片元可见,就把它的相关信息存储到GBuffer中去,GBuffer缓冲区包含以下几个衬着纹理对象:

[*]RT0:RGB通道存储漫反射颜色,A通道不使用;
[*]RT1:RGB通道存储高光反射颜色,A通道存储高光反射指数;
[*]RT2:RGB通道存储法线,A通道不适用;
[*]RT3:存储自发光、光照贴图和反射探针;
[*]Depth:存储深度缓冲和模板缓冲。
这些信息都可以通过Frame Debugger查看。



GBuffer

第二个Pass是真正进行光照计算的pass,在GBuffer中已经包含了光照计算的所有信息,它只需要读取缓冲区里的材质、位置、法线、光照、摄像机标的目的等信息,然后进行光照计算,最后再更新帧缓冲。因此,它不存在反复衬着光照信息的问题,从而极大地提高了衬着效率。



延迟衬着光照计算

顶点照明衬着路径

最后再来聊聊顶点照明衬着路径。严格来说,它仅仅只是前向衬着路径的一个子集,它是使用逐顶点的方式来计算光照。顶点照明衬着路径对硬件要求配置最少、运算性能最高,但是得到的效果最差。很多逐像素才能得到的效果,比如暗影、法线映射、高光反射等,顶点照明衬着都无法实现。
优错误谬误斗劲

前向衬着路径存在光照衬着瓶颈,因此对于光源量少的场景,还是很适合使用前向衬着路径的,这样就不会存在大量反复计算问题;
而延迟衬着能够适合光源数量很多的场景,而且衬着速度大大提高。但是因为它多采用了一个通道绘制几何信息,需要多衬着纹理的撑持,因此会占用更多的CPU和GPU,对带宽和机器设备会有更高的要求,部门老旧机器可能并不撑持延迟衬着。
除此之外,延迟衬着不撑持真正的抗锯齿功能,也不能措置半透明物体。
具体在项目中使用哪种衬着路径,还是得按照实际情况择优选择。
页: [1]
查看完整版本: Unity中的衬着路径RenderingPath