聊聊引擎底层如何实现BRDF渲染算法

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代码,如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第1张图片其实我们就是用编程语言写出算法而已,接下来再看F的算法实现,它主要是处理反射的,公式如下所示:
在这里插入图片描述
数学公式有了,下面我们将其应用到Shader编程中,我们用一个函数实现,代码如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第2张图片
另外,我们还可以在此基础上扩展,参考网址:
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的算法公式,如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第3张图片
而UE4引擎做了一个小的改动,如下所示:
在这里插入图片描述
对应的Shader代码如下所示:

聊聊引擎底层如何实现BRDF渲染算法_第4张图片我们的几何为了有效的估算几何部分,需要将观察方向(几何遮蔽(Geometry Obstruction))和光线方向向量(几何阴影(Geometry Shadowing))都考虑进去。我们可以使用史密斯法(Smith’s method)来把两者都纳入其中:

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

这样我们的G就完成了,对应的脚本代码如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第5张图片到这里,我们的FGD就完成了,下面将其带入我们第一步所列公式中,得到我们的BRDF渲染算法,实现的代码如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第6张图片
Epic Games使用了基于square roughness会产生更好的视觉效果,可以参考网址:
https://learnopengl.com/PBR/IBL/Specular-IBL
将其移植到我们的引擎中,对应的Shader代码如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第7张图片
对应着BRDF脚本如下所示:
聊聊引擎底层如何实现BRDF渲染算法_第8张图片其在我们引擎中实现的效果图如下所示:

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

你可能感兴趣的:(3D引擎)