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

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

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值