BRDF作为比较流行的渲染算法,但凡成熟的引擎的都有此功能,我们自己写引擎也不例外,我在编写引擎时也会参考网上的一些资料,这也是学习的过程,先介绍BRDF,它是双向反射分布函数,说白了它是对于物体表面上光的处理,BRDF有很多模型,我们在编写Shader的时候也是基于这些模型。BRDF使用的数学模型是Cook-Torrance公式,如下所示:


我们实现的BRDF渲染算法会参考Unreal Engine 4中所使用的函数,其中D使用Trowbridge-Reitz
GGX,F使用Fresnel-Schlick近似(Fresnel-Schlick Approximation),而G使用Smith’s
Schlick-GGX,下面我们就重点实现DFG,先看D的实现算法:


我们根据上述公式可以写出Shader代码,如下所示:
其实我们就是用编程语言写出算法而已,接下来再看F的算法实现,它主要是处理反射的,公式如下所示:

数学公式有了,下面我们将其应用到Shader编程中,我们用一个函数实现,代码如下所示:

另外,我们还可以在此基础上扩展,参考网址:
https://seblagarde.wordpress.com/2011/08/17/hello-world/
<https://seblagarde.wordpress.com/2011/08/17/hello-world/>
提供的代码,拿过来用到我们自己的引擎中,它的公式如下所示:

对应实现的代码如下所示:
float3 FresnelSchlickWithRoughness(float3 SpecularColor,float3 E,float3
N,float Gloss) { return SpecularColor + (max(Gloss, SpecularColor) -
SpecularColor) * pow(1 - saturate(dot(E, N)), 5); }
再看最后一个G,再求G之前,我们先求Smith’s Schlick-GGX的算法公式,如下所示:

而UE4引擎做了一个小的改动,如下所示:

对应的Shader代码如下所示:

我们的几何为了有效的估算几何部分,需要将观察方向(几何遮蔽(Geometry Obstruction))和光线方向向量(几何阴影(Geometry
Shadowing))都考虑进去。我们可以使用史密斯法(Smith’s method)来把两者都纳入其中:

G(n,v,l,k)=Gsub(n,v,k)Gsub(n,l,k)

这样我们的G就完成了,对应的脚本代码如下所示:
到这里,我们的FGD就完成了,下面将其带入我们第一步所列公式中,得到我们的BRDF渲染算法,实现的代码如下所示:

Epic Games使用了基于square roughness会产生更好的视觉效果,可以参考网址:
https://learnopengl.com/PBR/IBL/Specular-IBL
<https://learnopengl.com/PBR/IBL/Specular-IBL>
将其移植到我们的引擎中,对应的Shader代码如下所示:

对应着BRDF脚本如下所示:
其在我们引擎中实现的效果图如下所示:


总结:

我们在实现某个技术时,会查阅大量资料,将其领会贯通后应用到我们自己的项目中,其实我们在项目开发时也是一样的,这个就是自我学习的能力,每个开发者都要有这样的能力。利用别人的技术实现自己的东西,这本身就是一种能力,有多年项目经验的人,经常做的事情就是复制粘贴,人家在复制粘贴的过程中已经对这些代码烂熟于心,出问题了能够立马定位到。最后给读者强调一点,渲染技术并不时鼓励存在的,多种渲染技术能够互相结合起来使用,BRDF可以跟forward和deferred结合起来使用。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信