您现在的位置是:首页 >技术教程 >Unity | HDRP高清渲染管线学习笔记:HDRP光照系统网站首页技术教程

Unity | HDRP高清渲染管线学习笔记:HDRP光照系统

烫青菜 2024-09-06 12:01:03
简介Unity | HDRP高清渲染管线学习笔记:HDRP光照系统

目录

一、Light组件

1. Angular Diameter

2. Light Appearance

3. Intensity(光照强度)

4. Indirect Multiplier(间接光倍数)

5. Volumetrics(体积雾)

6. Shadows(阴影)

6.1 Shadow Map(阴影贴图)

6.2 Contact Shadow(接触阴影)

二、Reflection Probe组件(反射探针)

1. Type(反射贴图生成的方式)

三、Light Probe Group组件(光照探针组)

四、光照贴图烘焙

1. 光照贴图烘焙技术

2. 具体的烘焙操作

五、Volume Override

1. Shadows

1.1 MaxDistance

1.2 Working Unit(工作单位)

1.3 Transmission Multiplier(光传输乘数)

1.4 Cascade Count(阴影级联数)

2. Contact Shadows

 2.1 Length(长度)

2.2 Opacity(透明度)

2.3 Quality(质量)

3. Micro Shadows(微阴影)

4. Ambient Occlusion(环境光遮蔽)

4.1 Intensity(强度)

4.2 Direct Lighting Strength(直接光照强度)

4.3 Radius(半径范围)

4.4 Temporal Accumulation

4.5 Ghosting Reduction(减弱鬼影)


一、Light组件

1. Angular Diameter

        使用该选项可以控制平行光在物体上的高光强度,以及阴影的柔软程度

2. Light Appearance

        HDRP会使用Filter和Temperature两个参数来计算光源所发出光线的最终颜色。色温越高,越偏向蓝色;反之越偏向黄色。色温大于5000(单位为kelvins,表示为K)时,通常称为冷色调;反之则称为暖色调。

3. Intensity(光照强度)

        光照强度用于控制实际太阳光的亮度

4. Indirect Multiplier(间接光倍数)

        (注:如果在Window→Rendering→Lighting Settings界面中没有启用Baked Global Illumination选项,则此参数无效。)

  1. 将其设为1,用于模拟真实世界的光照。(副作用是可能产生过于强烈的间接光照,导致画面失真。)
  2. 如果设为0,那么这盏灯就不会在场景中产生间接光照信息。

5. Volumetrics(体积雾)

        此参数用于模拟光源发射的光线通过体积雾发生散射的现象。

6. Shadows(阴影)

6.1 Shadow Map(阴影贴图)

  • Resolution(分辨率)

        用于控制阴影的质量,质量越高阴影效果越好,当然也会相应增加GPU的负担和内存的使用量,从而可能导致性能问题。

6.2 Contact Shadow(接触阴影)

        在平行光组件的设置里面和HDRP配置文件中并没有提供可以调整接触阴影的选项。这时我们就要用到Volume中的Contact Shadows属性了。

二、Reflection Probe组件(反射探针)

1. Type(反射贴图生成的方式)

  1. Baked(以烘焙方式生成反射贴图)
  2. Custom(自定义)方式允许你自己指定一张Cubemap作为反射贴图(可用于制作特殊效果)。
  3. Realtime(实时生成)方式则可以提供比较精确的反射贴图,但是因为是实时计算出来的,所以性能较差。

三、Light Probe Group组件(光照探针组)

        光照探针组的作用是用烘焙的方式把场景中的间接光照信息(也就是当直接光照射到场景中物体的表面时,光线与物体发生碰撞并反弹所获得的光照信息)烘焙到光照探针上。当游戏运行时,场景里的动态物体游走于场景的各个区域。动态物体虽然无法参与光照烘焙(只有静态物体才能参与光照烘焙计算),但是可以通过采样这些光照探针上的间接光照信息,为自己提供更逼真的表面光照效果。

        光照探针被认为是一种价廉物美,为动态物体提供间接光照信息和生成动态阴影的高性能解决方案。

        光照探针组的烘焙不像反射探针可以通过组件上的烘焙按钮进行烘焙,光照探针的烘焙需要同时使用Lighting烘焙界面与场景的光照贴图来完成。

四、光照贴图烘焙

        如何在Unity中来模拟间接光呢?有两种方法:

  • 光照贴图烘焙(Lightmapping)。
  • 实时光线追踪(Realtime Raytracing):依赖硬件。

1. 光照贴图烘焙技术

        Unity自己研发的光照贴图烘焙技术,称为“渐进式光照贴图烘焙”(Progressive Lightmapper)。Progressive Lightmapper有两个版本: CPU版本和GPU版本。当然首选GPU,原因很简单:烘焙速度快。GPU版本的烘焙速度一般比CPU要快10倍左右。前提是GPU上的显存足够支撑整个烘焙过程;如果显存不够,系统就会自动切换到CPU版本继续烘焙,此时烘焙速度会显著降低。

2. 具体的烘焙操作

(1)物体设置为Static

(2)Lighting 光照烘焙窗口设置

        (a)Window→Rendering→Lighting 打开光照烘焙窗口

        (b)Mixed Lighting

        要想烘焙全局光照,必须在这里勾选Baked Global Illumination(烘焙的全局光照)选项,然后选择一种光照模式:Baked Indirect或者Shadowmask。

        Shadowmask和Baked Indirect之间的区别是:前者除了烘焙间接光照信息,也会在Lightmap(光照贴图)中把阴影烘焙进去。Shadowmask模式可以提供最逼真的阴影效果,当然性能消耗和内存占用也是较高的。Shadowmask模式适用于远处存在可见物体的场景,比如在高端机器上运行的开放世界游戏。

        (c)Lightmapping Settings

  • Lightmapper:可以选择Progressive GPU或者Progressive CPU,首选GPU版本。
  • Direct Samples、Indirect Samples和Environment Samples:用于设置采样值。采样值越大,光照贴图细节越多,相应的烘焙时间也越长。
  • Bounces:用于控制进行光线追踪计算时光线的反弹次数。反弹次数越多,光照贴图细节越多,相应的烘焙时间也越长。
  • Filtering:在Filtering下可以选择一种Denoiser(降噪算法)。可以分别为Direct Denoiser、Indirect Denoiser和Ambient Occlusion Denoiser选择不同的降噪算法。一般建议是根据不同的平台为这三项选择同一种降噪算法。比如为Nvidia显卡选择Optix;为AMD显卡选择Radeon Pro。OpenImageDenoise来自英特尔,是基于CPU的降噪算法,可用于所有平台。
  • Lightmap Resolution:此数值用于控制光照贴图的分辨率。分辨率越高,光照贴图的细节越多,相应的烘焙时间也越长。一般刚开始测试烘焙光照贴图时,可以尝试将其设为20或者30,然后逐渐增加,直到能够在合理的烘焙时长里获得满意的光照贴图细节。
  • Lightmap Padding:用于控制光照贴图中,按照UV分开的光照贴图区域之间的间隔大小。如果此间隔太小,有可能造成光照贴图边缘的颜色渗透。但是如果间隔太大,又会浪费光照贴图空间,增加贴图数量,导致光照贴图在内存中的占用增大。
  • Lightmap Size:用于控制每一张光照贴图的最大尺寸。

        (d)Auto Generate:一般在正式烘焙时不勾选此选项。如果场景较小或者硬件较好(比如开发用的电脑上配备了显存较大的显卡),则可以在试验烘焙阶段启用此选项。这样每次修改场景中组件的数值或者移动、旋转、缩放物体时,Lightmapper会进行自动烘焙。

        (e)Generate Lighting:当设置完所有参数后,单击此按钮开始烘焙。

(3)增强间接光强度:Indirect Lighting Controller (Volume Override)

(4)处理阴影和环境光遮蔽

五、Volume Override

1. Shadows

1.1 MaxDistance

        针对不同类型的光源,Shadows属性的作用分别如下。

  1. 对于Punctual Light(精确光源类型)使用Max Distance(最远阴影投射距离,单位为m)参数控制这类光源投射阴影的最远距离(超过此距离后,阴影将不再被渲染)。(精确光源类型:从一个点发射光线的光源,在Unity中为聚光灯(Spot Light)和点光源(Point Light))。
  2. 对于平行光类型这里使用Max Distance参数来控制Shadow Cascade(阴影级联)的最远显示距离(超过此距离后,阴影将不再被渲染)

1.2 Working Unit(工作单位)

        用于设置Split和Border数值的具体单位。

  1. 如果设置为Metric,则HDRP会使用m为单位;
  2. 如果设置为Percent,则HDRP会使用百分比数值。

1.3 Transmission Multiplier(光传输乘数)

        数值为0~1。可用于控制平行光照射到厚物体上时应用到光线强度上的乘数。

1.4 Cascade Count(阴影级联数)

        数值为1~4的整数。分别代表最少1个级联和最多4个级联。将它设置为不同的级联次数后,下面的Split和Border输入值的数量会发生相应的变化。比如设置4个级联,则下面会出现3个Split输入值和4个Border输入值。

2. Contact Shadows

        因为接触阴影的算法是基于屏幕空间的,所以它只能采样当前画面的数据用于接触阴影的计算,因此在使用接触阴影时,需要将其调整得细微一些,作为主要阴影的补充,而不是让接触阴影成为画面中阴影的主角。

 2.1 Length(长度)

        用于控制Raymarching算法所用射线的长度(以m为单位)。这也代表射线可以捕捉到的用于阴影计算的细节的最长距离。

2.2 Opacity(透明度)

        用于控制阴影本身的透明度。

2.3 Quality(质量)

        用于控制阴影的质量。质量越高,采样数量越大,相应的性能消耗就越大。如果这里选择Custom,则我们可以自定义Sample Count(采样数量)。

        Contact Shadows只会在当前场景中的“主光源”上起作用。那么HDRP是如何判断场景中哪个光源是主光源的呢?有以下两种判断方式。

  1. 当前场景中没有平行光灯(Directional Light)的情况:HDRP判断当前画面中,哪一盏灯的包围盒(Bounding Box)尺寸在屏幕上占比最大,那么占比最大的那盏灯就是主光源。整个场景中也只有那盏灯能够投射接触阴影。
  2. 当前场景中有平行光灯的情况:不管场景中还有什么光源,这盏平行光灯都是主光源。这种情况下只有平行光灯会投射接触阴影。

3. Micro Shadows(微阴影)

        微阴影的参数很简单,一个Enable开关和Opacity(透明度)参数,它用于调整阴影的透明度。

        Micro Shadows会使用材质上的Normal Map(法线贴图)和Ambient Occlusion Map(环境光遮蔽贴图)来计算物体表面微小的阴影。HDRP不会使用网格表面数据来计算微阴影。注意,使用Micro Shadows会增加性能的消耗。

4. Ambient Occlusion(环境光遮蔽)

        Ambient Occlusion(环境光遮蔽),简称AO。环境光遮蔽也是基于屏幕空间计算出来的,所以会有和Contact Shadows类似的边缘显示问题。因此在使用环境光遮蔽时,原则上不能把效果调得太明显,而是以辅助为主。

4.1 Intensity(强度)

        用于控制环境光遮蔽的显示效果。数值越大,效果越强,其影响的区域(墙角、空洞等)会变得更黑。

4.2 Direct Lighting Strength(直接光照强度)

        用于控制接受直接光照的区域的环境光遮蔽强度。数值越大,该区域越黑。

4.3 Radius(半径范围)

        用于控制HDRP在屏幕空间中搜索遮挡物的范围。此数值越大,环境光遮蔽起作用的区域越大,但是显示质量可能会降低。

4.4 Temporal Accumulation

        启用该选项以后可以在计算AO时,利用前面生成的帧获得更好的效果(需要在相机的Custom Frame Settings中启用Motion Vectors支持)。不过可能在这个过程中会产生鬼影效果(Ghosting)。为了减弱鬼影效果,我们要用到下一个设置。

4.5 Ghosting Reduction(减弱鬼影)

        数值越接近于0,鬼影越严重,但是这可以减少画面中因为使用Temporal Accumulation而产生的噪点;反之数值越接近于1,鬼影效果越不明显,但是噪点会更严重。我们选择0.5作为折中的方案。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。