Unity学习笔记 Vol.107 Unity 实时光追(十一)- 应用光追功能到现有HDRP项目中
记笔记

通过前面的10个节,我们一起系统的学习了,如何使用unit HDRP中提供的各种光追功能,让它们为场景添加更多的细节,这些光追功能包括环境光遮蔽、屏幕空间反射、屏幕空间全局光、屏幕空间阴影、次表面散射、递归式渲染等

在这节中,我将会使用来自Unity资源商店的ArchVizPro系列场景模型为大家演示,如何为一个基于HDRP高清渲染管线的场景,增加更多的光追细节,比如让物体表面呈现更精确的反射。

这里需要声明一点,我并不是鼓励大家去购买这些模型,我使用ArchVizPro的目的是想让大家知道,即使在一个像ArchVizPro这么高质量的实时渲染场景中,如果使用光追功能,还可以为它带来很大的画面细节提升。
如果大家没有这个场景的话也没有关系,我在这里讲内容,完全可以应用到其他任何HDRP项目中去。

我们先来了解一下这个ArchVizPro的HDRP场景,首先打开HDRP Render Pipeline wizard窗口。我们可以看到,当前项目的设置是针对普通HDRP的,稍后我们会在这里切换到HDRP + DXR设置,让项目支持光追功能。

在Hierarchy层级窗口展开3D Light里面包含了场景中的部分光源和Light Probe光照探针,这里有部分光源被设置成了实时的,也有设置为纯烘焙的。

我们知道,纯烘焙所得的光照信息会被保存在光照贴图中。

在运行时,这些参与烘焙的光源其实是不起作用的,而设置成Realty实时类型的光源,则只能为场景提供直接光照信息,无法提供间接光照,当前场景中的另外一些光源则与模型关联在了一起。

我们可以通过Window => Rendering菜单中的Light Explore窗口找到场景中的所有光源
以及其他相关的物体,比如Reflection Probes, Volume,Light Probes等。

接着我们展开3D Reflection,这里面包含了所有的反射探针,这些反射探针为场景提供了,基于Cubemap立方体贴图的反射效果,虽然效果不错,但是并不精确。


最后我们看一下3d HDRP下的Volume设置,Scene Setting是一个全局模式的Volume里面的设置可以影响整个场景,这里也有全局模式的后处理Volume,以及针对场景中不同部分的
后处理Volume。
之后,我们将会创建跟光追功能相关的Volume,当然你也可以把光追功能添加到新Settings,这个Volume中,我们单独放是为了便于管理这些光追设置。


接着我们要为这个场景设置光追功能,首先我们要在HDRP配置界面把普通HDRP转换成HDRP + DXR

然后我们要通过HDRP配置文件界面,启用相关的光追功能


比如RayTracing、屏幕空间反射、屏幕空间全局光照、屏幕空间阴影等

接着通过HDRP,默认设置界面中的默认帧设置界面,启用相关的光追功能。


然后,检查Scene窗口中的摄像机是否开启了 TAA

并检查是否开启了always refresh选项,上述步骤在第2个节中,曾有过详细的讲解,这里不再赘述。

接着我们来检查当前项目中,需要参与光追计算的物体上的材质,确保这些材质启用了相关的光追功能,比如SSR/SSGI

透明物体上的SSR,Recursive Rendering 3S效果正确设置了Diffusion Profile。

这里请注意,我们可以选择性的为场景中的物体打开材质上的这些功能,如果某个物体无需参与,相关光追功能的计算,那我们就不要在材质上使用这些功能


最后我要在层级窗口的3D HDRP层级下创建一个Game object,命名为Ray Tracing Settings,然后在上面添加一个Volume组件,在这个Volume上,我们可以使用默认的Global全局模式,设置完毕。

我们现在可以在Volume上添加想要使用的光追功能了,第一个我要添加的是环境光遮蔽,我们可以看一下Volume上环境光遮蔽的参数,因为环境光遮蔽属于补充阴影的效果,所以我们一般不会把这里的Intensity强度数值设置的很大。




我们来看一下客厅中一些物体上的环境光遮蔽效果,比如在沙发边上的灯罩的内侧,树叶的下方,沙发侧边的下方。与光栅化算法相比,光追版本的环境光遮蔽可以为我们提供更好的遮蔽效果。

第2个我们要添加的是屏幕空间反射效果,当前场景中,已经在关键位置放置了球形反射探针和平面反射探针。

不过要为场景中多个镜子提供准确的反射信息,我们需要用到屏幕空间反射,光追版本的屏幕空间反射可以为这些镜子,提供非常精确的反射信息。

我们来看一下屏幕空间反射在Volume上的具体参数,目前我们使用的是Performance性能模式。


我们来看一下这面镜子中的反射,这是我们不使用屏幕空间反射时,仅仅依靠来自反射探针的反射信息所能达到的效果,可以看到,目前镜子中并没有对面放着的花盆,以及里面的植物,而且还显示了并不在镜子面前的茶几,这显然是不对的。

之所以在镜子中显示出了茶几,是因为镜子使用的反射探针,是位于客厅中央的反射探针

当我们启用了光追版本的屏幕空间反射效果以后,可以看到镜子中,准确的显示了对面的植物客厅里。

另外一个例子是茶几上的盘子和书,下面没有真实的反射信息

启用了光追版本的屏幕空间反射以后,书本和盆子,精确的反射在了玻璃桌面上。

我们再来看一下,浴室水龙头表面上的反射,其实对于这个水龙头表面来说,他并不需要参与屏幕空间反射的计算,因为水龙头比较旧,表面已经不再像新的水龙头那么光滑,除非你要给他特写镜头,否则用反射探针上的反射信息已经绰绰有余了。

因此,我们可以去水龙头的材质中把Receive SSR/SSGI选项进行禁用。

不过对于后面的镜子来说,只是使用反射探针上的反射信息,显然是不够的,你甚至都看不到镜子中的水龙头。

因此,我们可以把镜子材质上的SSR功能启用。

但是镜子中的水龙头和其他,反射的物体表面看上去很白,这个感觉很奇怪啊。
这时我们需要来看一下,当前场景中的Light Cluster的情况,如果大家已经忘记了Light Cluster是拿来做什么用的,可以回去看看之前Light Cluster相关的内容。

首先我们要为场景添加Light Cluster重载,然后在Debug窗口的Lighting界面,把FullScreen Debug mode设置为Light Cluster。


我们可以看到,目前的Light Cluster的设置是有问题的,整个Light Cluster的几乎都是红色的,这意味着,每个单元格中的光照数量,已经超过了我们在HDRP配置文件中的设置从而也导致了,刚才镜子中的水龙头和有些物体表面变成了白色。

为了解决这个问题,我们可以打开Project Settings界面,然后在Quality下面的HDRP设置界面,选择HD Render Pipeline Asset这个HDRP配置文件,然后在Lighting设置的部分

找到Lights里面的Maximum Lights per Cell (Ray Tracing)参数,将这里的数值从8增加到15

然后再次在Debug中切换到Light Cluster的显示模式,可以看到只有部分地方还是红色。

我们回到Project Settings界面,将Maximum Lights per Cell (Ray Tracing)这个参数再次调整设置为20,然后打开Light Cluster的Debug显示模式,这次可以看到所有的单元格都是绿色的了。

切换回正常显示模式,可以看到镜子中的水龙头显示正常了。

我们也可以把SSR的重载参数,它的模式设置为Quality质量模式,这样我们就可以通过调高Simple Count的采样值和Bounce Count的反弹次数,来提高反射的质量,不过提高这两个参数,在获得更好效果的同时,我们是需要付出代价的,那就是帧率的降低,这是目前无法避免的一个问题。
不过对于制作竞争或者影视动画来说,这是可以忍受的,毕竟获得了更好的效果,但是按照目前的硬件条件对于游戏开发者来说就不那么友好了。

最后我们要在场景中,尝试使用屏幕空间全局光,在Volume上添加SSGI重载,然后我们到厨房看看,我们在厨房这个部分,看到地板上的地毯是黑色的,选中地毯材质,可以发现材质上没有打开Receive SSR SSGI选项

把它勾选启用以后,就可以获得正确的光追,屏幕空间反射和全局光了。
在之前的屏幕空间全局光章节中提到过,在使用默认光栅话版本的全局光时,HDRP 会把这些屏幕空间全局光信息,叠加在烘焙所得的光照贴图上。但是如果我们启用光追版本的全局光,HDRP就会禁用烘焙所得的光照贴图,这时场景中的全局光将会全部来自光追算法的屏幕空间全局光。

如果我们把模式设置为Performance性能模式,即使我们把质量设置为High,整个画面质量也没有提升多少。

我们可以切换到Quality质量模式,然后调整Simple Count产量值为2,Bounce Count的反弹次数为3,Clamp Value设置为最大值10,可用于提升画面的整体亮度。

稍微等一会,可以看到整个室内场景可以获得,类似光照烘焙所能获得的全局光。
不过帧率很低,这也是目前使用,屏幕空间全局光的一个问题,但是屏幕空间全局光也有烘焙所得的全局光所不具备的优势。

我们来看一下厨房两个朝外的窗户,他们上面各有一个面积光源,我们可以把一个光源的颜色改成红色,另一个改成蓝色

可以看到,在不启用光追版本的,屏幕空间全局光时,场景中没有带颜色的全局光,我们必须通过,光照烘焙才能获得这类全局光,但是因为光照烘焙只能针对静态物体,所以如果是针对动态物体,通常我们只能通过不那么精确的Light Probe光照探针来提供这些全局光信息。

现在有了光追版本的全局光照,我们可以看到整个场景马上获得了准确的带颜色的全局光
而且红色和蓝色的光会发生自然的混合。

这可以同时作用于动态和静态物体,我们一步到走廊,走廊两侧的墙上有6组灯,我们随便选择一组灯看一下设置,在这个灯下面有4个光源,两个用于纯光照烘焙的两个实时的,但是两个实时光源,目前设置成不影响漫反射,只影响高光

然后4个光源都设置成参与光追计算

不过目前用于纯光照烘焙的灯光,其实是不参与光追计算的,所以我们可以把它们都禁用

我们只需要实时光源参与光追计算即可,但是我们要打开Affect defuse影响漫反射这个选项,让光照影响漫反射。

启用光追版本的屏幕空间全局光

这样就可以看到走廊比之前亮了,我们再转到客厅,看一下屏幕空间全局光的效果。

我们可以看到通过屏幕空间全局光,我们可以获得近似于通过光照烘焙,所得到的全局光效果,只不过目前他的速度相对较慢,而且在低采样值的设置下,我们可以看到,墙上的跟物体上的噪点较多。