Unity Shader:基于物理的渲染

本文同时发布在我的个人博客上:https://dragon_boy.gitee.io

PBR理论和基础

微表面模型,能量守恒

一个物体的的表面可以被分割为无数个小的微表面。每个微表面可以可以理解为片元,进行正常的光的操作。微表面可以用来描述表面的粗糙度,表面越粗糙,微表面的法线分布越不均匀。

根据菲涅尔现象,反射光只占入射光能量的一部分,根据能量守恒,折射光占入射光能量另一部分。

由于金属材质和非金属材质在物理上有很大的区别,金属材质,或者说电解质,导体,偏向于吸收折射光,而非金属偏向于散射部分折射光(次表面散射技术)。我们使用近似,即金属材质完全吸收折射光。这里不考虑次表面散射技术。

BRDF

我们使用辐射率来量化光。辐射率是单位面积、单位方向上光源的辐射通量,通常用L表示。在渲染中,我们使用基于表面的入射光线的入射辐射率计算出射辐射率。这个过程被称为着色。

要得出,我们需要知道物体表main一点是如何和光进行交互的。这个过程使用BRDF来定量分析。

首先给出反射等式:

上述等式,给定观察视角,该方向上的出射辐射率等于所有入射方向的辐射率积分乘以它的BRDF值,再乘以一个余弦值。

针对一个精确光源,我们可以使用一个特定的BRDF值来代替积分操作:

是光源方向,是光源颜色。

根据能量守恒,BRDF可以分为两个向,高光反射项和漫反射项。

漫反射项

Lambert BRDF为:

表示漫反射光线所占的比例。上述的式子是一个定值。

给定入射方向的光源在表面某点的出射漫反射辐射率为:

上述的漫反射项很简单,下面是迪士尼使用的BRDF的漫反射项:

上面的式子也是Unity使用的漫反射项。

高光反射项

BRDF的高光反射项建立在微表面模型理论上,即上面提到过的粗糙度。

假设表面的法线为,这些微表面法线并不都等于,因此,不同的微表面会把同一入射方向的光线反射到不同的方向上。当我们计算BRDF时,入射方向和观察方向被给定,这表明只有一部分微表面的反射光会进入我们的眼中,这部分微表面恰好会把光线反矢量射到方向上,即它们的法线等于半矢量。

这些的微表面反射也并不会全部添加到BRDF的计算中。不同微表面之间也会相互遮挡,这些被遮挡的微表面不参与高光反射项的计算。

BRDF高光反射项的式子:

是微表面的法线分布函数,用于计算有多少比例的微表面的法线满足,是阴影——遮挡函数,用于计算上述微表面有多少会被遮挡。是菲涅尔反射函数,用来计算反射光的比率。

Unity的PBR实现

Unity的PBR的BRDF使用的是迪士尼的漫反射项,基于GGX模型的高光反射公式。
漫反射项:

高光项:
法线分布函数:

阴影——遮蔽函数使用Smith-Schlick模型:

菲涅尔等式使用Schlick菲涅尔近似等式:

是高光反射系数。

Unity使用上述的公式实现的PBS就是Standard Shader

你可能感兴趣的:(Unity Shader:基于物理的渲染)