UnityURP管线——IBL基于图像的光照

UnityURP管线——IBL基于图像的光照

Unity URP管线——IBL基于图像的光照基于图像的光照(Image Based Lighting)

在现实生活中,光来自各个方向,或是直接来自光源,或是间接来自环境中物体的反弹,并在这个过程中被部分吸收。在某种程度上,可以将物体周围的整个环境是为光源。图像,特别是立方体贴图,是编码这种“环境光”的好方法。这称为基于图像的光照(IBL),或有时称为间接光照。

unity全局光照_unity光照_unity 光照探头

上图显示的物体只使用图像编码的环境光进行光照。请注意使用此技术可以实现的微妙光照效果。

基于图像的光照存在局限性。显然,必须以某种方式获取环境图像,正如我们将在下面看到的那样,在将其用于光照之前,需要进行预处理。通常,环境图像实在现实世界中离线获取的,或者由引擎离线或实时生成;无论哪种方式,都需要使用局部或远程探头。

这些探头可用于获取远程或局部的环境。在本篇文中,我们将重点放在远程环境探头上,其中假定光线来自无限远(这意味着物体表面上的每个点都使用相同的贴图环境)。

整个环境都会为物体表面上的特定点提供光;这称为辐照度(E)。从物体反弹出的光称为辐射度(Lout)。入射光照必须一致性地用于BRDF的漫反射和镜面反射部分。

基于图像的光照(IBL)的辐照度和材质模型(BRDF)f(Θ)之间的互相作用所产生的辐射Lout的计算方法如下:

公式里的Θ代表材质模型f的参数,即:粗糙度,反照度等......

请注意,这里我们正在查看宏观层面的表面行为(不要与微观层面的方程混淆),这就是为什么它只依赖于n和v。基本上,我们将BRDF应用于来自各个方向并编码的IBL中的“点光源”。

IBL类型

现代渲染引擎中使用的IBL有四种常见类型:

此外,我们必须区分静态和动态IBL。实现完全动态的昼夜循环需要动态地重新计算远程光探头。平面和屏幕空间反射本质都是动态的。

这可以通过混合静态探头, 或通过随时间推移工作负载来完成.

IBL单位

如前面直接光照部分所述,我们实现的所有灯光都必须使用物理单位。因此,我们的IBL将使用亮度单位cd/m2,这也是所有直接光照方程的输出单位。对于引擎捕获的光探头(动态或静态离线)使用亮度单位非常简单。

然而氛围,高动态范围图像处理起来更麻烦些。相机不会记录测量的亮度,而是记录依赖于设备的值,这个值只是与原始场景的亮度相关。因此,我们必须为美工提供一个乘数,这样他们能够恢复或至少近似地回复原始的绝对亮度。

为正确地重建HDRI的亮度用于IBL,美工必须做的不只是简单地拍摄环境照片unity 光照探头,还要记录额外的信息:

处理光探头

我们之前看到IBL的辐射度是通过在表面半球上进行积分来计算的。显然,对于实时渲染来说这种做法太过昂贵,所以我们必须首先对光探头进行预处理3D植物,将它们转换为更适合实时交互的格式。

以下各节将讨论用于加速计算光探头的技术:

远程光探头漫反射BRDF积分

Lambertian BRDF不依赖于l,v或和θunity 光照探头,因此Ld(n,v,θ)≡Ld(n,σ), 使用Lambertian BRDF,我们得到了辐射度

unity光照_unity 光照探头_unity全局光照

其中辐照度

或者,在离散域中:

Ωs为与样本i相关联的立体角。

对于立方体贴图,Ωs可以使用 2π/6*width*height 近似。

辐照度积分Ed可以简单地,尽管很慢(O(12n2m2))n和m分别为环境尺寸和预计算的立方体贴图),预先计算并存储到立方体贴图中,以便在运行时可以高效访问。通常,image是一个立方体贴图或等距矩形图像。σ/π项独立于IBL,在运行时添加以获得辐照度。

unity全局光照_unity 光照探头_unity光照

上图是基于图像的环境

unity光照_unity全局光照_unity 光照探头

上图是使用Lambertian BRDF的基于图像的辐照度图。

然而,辐照度也可以通过分解为球谐函数(SH

nnd,球谐函数我也不会,先去学球谐函数,回来再写。

文章参考

Physically Based Rendering in Filament 灯丝中基于物理的渲染

文章来源:http://60.167.161.240:8090/archives/unity-urpguan-xian----iblji-yu-tu-xiang-de-guang-zhao