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结合起来使用。

聊聊引擎底层如何实现BRDF渲染算法相关推荐

  1. 聊聊引擎底层如何实现Bloom渲染算法

    Bloom渲染是游戏中常用的,在Unity和UE4中也有Bloom渲染算法如果我们自己实现Bloom渲染算法,该如何实现呢?网上关于Bloom的实现算法讲述的也比较多,但是我们本篇实现的Bloom渲染 ...

  2. 聊聊引擎底层如何实现SSAO渲染

    网上关于SSAO渲染介绍的很多,本篇博客也是将现有算法应用到我们自己研发的3D引擎中,SSAO被称为屏幕空间环境光遮蔽,它的原理是:对于铺屏四边形(Screen-filled Quad)上的每一个片段 ...

  3. [引擎开发] 深入GPU和渲染优化(基础篇)

    GPU/渲染优化是引擎开发中非常重要的一个环节,实际上在工程中做任何渲染相关的内容,都需要考虑到背后的原理和性能.另一方面,GPU/渲染优化是一个非常宽泛的课题,它不仅涉及到针对底层GPU的架构做出的 ...

  4. 渲染算法学习(六)-- Real-Time Physically-Based Materials

    目录 PBR and PBR Materials Physically-Based Rendering (PBR) PBR materials in RTR PBR materials Microfa ...

  5. 高糊视频秒变4K!Facebook发布低分辨率视频实时渲染算法,网友:是好东西,但是玩不起...

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 还记得那个引来巨大争议,最后把LeCun逼退推特的低分辨率图像还原算法PULSE吗? PULSE是针对低分辨率图像进行还原的,而就在PUL ...

  6. Scratch上传作品加载之分析(封面获取),base64转blob 前后端方案,前端 后端 解析base64为Blob,2021年较底层进行sb3作品渲染

    采坑的初衷: 考虑到作品的私有性.用户上传的作品必须是私有的,当且仅当用户设置作品公开 (理论上得提交给管理员,进行审核,管理员进行操作).那么才能够通过projectHost的方式去请求. 也就是说 ...

  7. 虚幻引擎学习之路:渲染模块之光照系统

    原文链接:https://blog.uwa4d.com/archives/Study_unreal4_Rendering_1.html 写在前面 "UWA什么时候可以支持Unreal引擎?& ...

  8. Unity3D 海水多线程渲染算法实现

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  9. 简要评说Adobe的FlashPlayer的渲染算法

    前些时候看到CSDN上一篇文章介绍FlashPlayer的渲染效能是HTML 5的数倍文章,回想起几年来对Adobe的FlashPlayer研究,想从理论上探究一下为什么会有这样的结果,同时也解释一下 ...

最新文章

  1. 一篇文章告诉你如何成为数据科学家
  2. ae去黑插件_视频素材如何去黑底?送你这款插件,自动一键去黑底。适用AE、PR...
  3. 单片机c语言正弦计算器,求一个 89C51 简易计算器的c语言程序 只要加减乘除就行!...
  4. winxp精简版没有IIS的解决办法
  5. mysql中什么叫临时表_MySQL中使用临时表需要注意哪些?
  6. XEIM 帮助文档【草稿版】
  7. oracle自定义存储过程:删除表(无论表是否存在)和检测表是否存在
  8. 前端进阶之防抖与节流是什么?
  9. 热点热词 新闻热点 最新新闻数据API接口-天狗热点热词开放平台
  10. 聚类(3)-- Gaussian Mixtures Model
  11. 设计模式-1-单例模式
  12. M1 mac 安装打印机驱动程序
  13. 模拟CMOS集成电路设计中的gm/id设计方法及用Cadence Virtuoso IC617仿真有关参数曲线
  14. java中类图概念_UML类图详细介绍
  15. 【树莓派】安装C#运行环境
  16. android 自动发短信的代码,Android点击按钮时自动发送短信
  17. ORACLE公司传奇历史
  18. 服务器端获取签名直传OOS
  19. 量子力学(4) 全同粒子
  20. Vue脚手架、镜像源下载及使用

热门文章

  1. JAVA中opencsv包解析CSV大文件
  2. 5.8日, 服务器青龙面板拉ksjsb脚本教程~
  3. 虚拟机桥接模式上网,局域网内ping通
  4. 软件工程专业考研是否更有利于找工作?
  5. 五款开源虚拟化技术软件大推荐
  6. 计算机网络虚电路数据报,虚电路服务和数据报服务
  7. 【干货知识】Redis:从应用到底层,一文帮你搞定
  8. Maya:好玩的物体替代
  9. [go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册
  10. Python中的decimal.Decimal类型和整型相乘后还是decimal.Decimal类型