Irradiance Caching:辐照缓存GI引擎
全局光照拥有不同GI引擎的原因:一般针对于我们动画创作。大部分情况下都是主体进行运动,并且前后几帧差异不大,周边的环境信息基本不变。因此几个周边像素可以共享光线的光子采样信息。这样就意味着我们没有必要计算摄像机视野范围内所有的GI光子信息。因此辐照缓存则可以使用这一点在场景中选择几个光子点,进行光子信息的计算(相当于划分区域,每个区域选一个代表)这样就可以减少渲染的时间,计算量少了。
辐照缓存的点信息是只存在摄像机视野范围内,并且平坦区域会分布少量的光子点。拐角处分布的点数量会较多。
这些“代表“称之为辐照缓存点,周边的结果则会根据采样信息自动补齐,即白色的点(结果就是不精准,并且平滑了)
相对于暴力算法,辐照点云不需要对每个像素都设置一个光子点,而是根据平坦程度,设立”代表“这样计算的速度会更快。
- 优点:
- 比暴力算法要快很多倍
- 计算的光子信息可以储存,如果在不修改灯光和模型的情况下可以重复使用。因此我们调节一些抗锯齿。材质球等可以直接用之前计算好的。
- 针对于室内渲染速度更快,因为平坦对象较多。
- 如果增加了图片的分辨率,一般情况下不会线性增加辐照缓存的时间。如果渲染的分辨率从1028*720增加到2560*1400(多了4倍的分辨率)构建辐照缓存的时间不会翻4倍。(具体的要看场景的复杂度和辐照缓存的设置)
- 缺点:
- 辐照缓存只能用于区块渲染,无法用于交互式渲染。
- 辐照缓存由于是选代表,因此如果代表光子较少,那么就会产生斑块和闪烁。
- 参数比较复杂,需要根据场景调整基于辐照缓存的内存空间。
- 不适用于摄像机视野范围内具有复杂的场景,比如摄像机视角被一大片树叶遮挡,那么就会分布更多的光子点进行计算,这样的计算效率还不如暴力计算。(这一点可以通过添加对象标签,让某个对象单独进行 暴力算法计算 解决)
接下来我们就来看一下辐照缓存的参数:
Mode:模式,辐照缓存是需要储存光子信息的,因此提供了很多不同储存的模式。
- Rebuild(don’t Save):构建但不保存,渲染时从头开始构建一个全新的光子缓存,但是不会保存到磁盘,直到该帧被渲染完成。
- Rebuild(Prepass Only):预处理构建,只构建光子缓存到磁盘,不进行最终的渲染。
- Rebuild:构建,构建光子缓存,并进行最终的渲染。
- Load:加载,加载光子缓存,并进行最终的渲染。tip:如果针对于动画的渲染,记得保存时最好添加$frame令牌后缀,不然很多帧只有一个辐照缓存文件,因为后面新的会把前面的覆盖掉。
- Flythrough Mode:飞跃模式,这个指的是:如果是简单的动画渲染,只有摄像机在运动,场景中物体和灯光没有运动的情况下,可以使用一帧的光子缓存信息计算整个动画的渲染。(不适用于辐照缓存,我们上面提到过,针对于辐照缓存它是在摄像机视野范围内分布光子)
- Frame to blend:混合的帧,当加载光子缓存的时候可以根据前后帧的信息进行平均,这样可以改善一些因为光子闪烁的问题。tip:辐照缓存不适合使用光子缓存来加快场景的渲染, 因此光子的分布是根据摄像机视野角度进行决定的。只有以下场景的修改不会影响:
1.抗锯齿类的设置
2.采样光线数量的调整
- Show Calculation:显示计算,显示光子构建的信息。(就一个显示作用,主要来判断光子的分布状态)
- Separate Point for Secondary Rays:对其他类型光线信息使用单独的光子点,默认情况下一个光子点要储存很多的信息,列如反射折射等。这样有时候会出现精度和密度(储存量)上一帧下一帧不一致的问题。因此我们可以勾选这个参数,让不同的光线类型进行单独储存。同样代价是会花费一定的储存空间。(个人建议电脑硬件够强最好就直接勾选,做项目的时候不可能等出现问题采取解决,最好能够前期就避免掉)
- Visualize Points:可视化点,将在最终渲染图像上显示光子点的分布状态。主要是配合下面的颜色阈值来判断阈值是否合理。Preset:
- Min/Max Rate:最小最大率。辐照缓存的构建是从最低的分辨率通道开始逐渐提高分辨率。低分辨率用于计算平坦低对比度的光子信息,高分辨率用于处理更多细节和对比度较高的区域。Min用于设定辐照缓存的光子分辨率通道最低为多少。
- -5 表示“将分辨率除以 32”
- -4 表示“将分辨率除以 16”
- -3 表示“将分辨率除以 8”
- -2 表示“将分辨率除以 4”
- -1 表示“将分辨率除以 2”
Max用于设定,最终图像每个像素需要多少个光子代表。
- 0 表示每个最终分辨率使用一个光子代表
- 1 表示每个最终分辨率像素使用 4 个光子代表针对于1920*1080的分辨率。设置为(-3,0)则将分四次计算光子信息。1.240*135(1920/8=240,1080/8=135)
2.480*270
3.950*540
4.1920*1080
最终渲染的分辨率越高,那么min也应该越小,这样提供的细节也会越多。如果细节不多也会加快渲染速度。
场景细节多了,可以增加Max值,增加每个像素的光子代表数量。
- Color Threshold:颜色阈值,通过颜色的对比度来分布光子,数值越低分布的越多,一般范围为0.01-0.001之间。针对于一些粗稿渲染可以给高一些。比如2。(如果想分布更多的光子点,那么需要增加光线的(下方的Ray参数)数量。
- Distance Threshold:距离阈值(这个档位越高精度越高),控制拐角和折痕附近的点数。这个只有四个档位。一般Medium中等就足够了。具体的可以打开Visualize Points看分布的是否足够
- Normal Threshold:法线阈值(这个档位越高精度越高),这个就针对于球体这类曲率的对象光子点分布情况。
- Min Detail:最小细节,主要作用是来控制上面的阈值参数,放置分布过多的光子点。值2代表尽量不要在两个光子点距离低于两个像素的时候分布更多的光子点。值6则为6个像素的距离,依次类推。最终渲染的时候为了质量,改为0即可
- Radius Factor:半径系数,我们有了光子点之后需要进行参与最终的渲染,这时候我们可以对光子点涵盖(影响)的区域进行重新定义(相当于模糊化),好处是可以减少斑点,代价是降低渲染精度。值不易太大。
- Smoothing Passes:平滑次数,针对于一些伪影现象,完美方案是增加采样的数量,但是这样的开销太大。因此我们可以对其进行模糊处理。同样,如果模糊了,就会丢失细节。
- Ray:决定了每个辐照缓存光子点的质量,每个光子点的光线计算方式和暴力算法是类似的。光线少了会导致每个光子点的信息不足。这里的数量是根据场景中光源的亮度情况,场景较亮并且有多个光源的时候,光线数量可以使用500-1000左右。如果场景很暗则需要更多的光线才能获得清晰的结果,列如2000-4000。(但是我们不可能让每个光子信息都需要这么多的光线,一些不明显区域我们可以让其光子点享有的光线数量降低,这样可以提升利用率以加快计算渲染速度。因此我们就需要一些阈值和自适应来调整。)
- Adaptive Amount:自适应量,控制可以自适应分配光线的百分比。假设光线为1000条,0.85的自适应。那么将有85%(850)条光线会根据下面的自适应错误阈值进行合理分配使用。剩下的15%(150)条光线不受影响。如果自适应值为0,那么每个光子都会分配到1000条光线。
- Adaptive Error Threshold:自适应错误阈值,控制自适应光线具体分配多少,阈值越低那么分配的光线也就越多,结果也就越精准。
针对辐照缓存GI引擎的参数也就这些,我们会看到参数相比暴力算法GI引擎多了很多,并且参数设置都比较繁琐。但是合理设置针对于项目的渲染还是有质的提升。
这里大家根据自己电脑的性能和感受选择即可,个人建议可以多用用,用着就熟练了,同样也提供了一些一键的档位预设,我们直接用也可以。