BRDF101

概述

本文基于知乎Maple对brdf的文章,在此基础又收集了一些其它来源的关于brdf的文章,希望能够完全理解记忆相关知识

关于Jakub Boksansky的文章,看的过程中又去搜集了很多其它文章来理解,发现已经超出了我目前的知识厚度,因此只会简单的翻译一下我能理解的部分,感兴趣的可以自行看原文。

侵删~~~

Maple

文章地址:https://zhuanlan.zhihu.com/p/21376124

文章讨论了BRDF(Bidirectional Reflectance Distribution Function)双向分布反射函数

介绍了辐射度量学、BRDF定义、如何使用BRDF计算

ScratchPixel

scratchpixel关于brdf的教学内容偏少 基本上被maple的文章内容所覆盖 但是仍然可以起到补充的作用

地址:https://www.scratchapixel.com/lessons/3d-basic-rendering/brdf-linear-exposure/intro-brdf.html

Flux(辐射通量)、Irradiance(辐照度)与Radiance(辐射率)

结合上图理解

辐照度可以看作量化给定点的入射光子数,而辐射率是量化给定点从特定方向的入射光子数,辐射率可以代表从给定方向观察看到的点的颜色

其中给定点指的是很小的面积 \(dA\) 在这个极小的面积上辐射通量可以看做是不变的

而特定方向可以用一个非常小的圆柱体来表示 由于透视关系显示为小圆锥体

并且上图中的\(\theta\) 代表着通过该点的光子数占总光子数的比例 当圆柱体垂直时 全部光子通过该点 当圆柱体平行该点时 通过该点的光子数为0

根据辐照度与辐射率的单位或者具体的定义

我们可以得出 一个点的总辐照度 可以通过聚合打到该点半球上所有方向的入射光线辐射率:

而当我们只考虑一个方向时 就得到了辐照度的微分表示:

而BRDF定义了入射光辐照度 和 反射光辐射率的比值:

我们经过积分 就可以得到从特定方向观察到的某个点的颜色 即特定方向该点的辐射率:

Jakub Boksansky

Jakub Boksansky是一位来自英伟达的图形程序员,他的博客里实现了brdf 并且也是 Ray Tracing Gems II Chapter 14 的配套代码

地址:https://boksajak.github.io/blog/BRDF

BRDF的性质

独立性

BRDF 描述了给定的入射光和出射光方向组合的表面反射率。换句话说,它决定了当一定量的光从另一个方向入射时,有多少光在给定方向上反射,具体取决于表面的特性。这个公式非常灵活,因为它使我们能够将表面材料的响应封装到 BRDF 实现及其参数设置中,这独立于光传输的底层算法。请注意,BRDF 不区分直接和间接入射光,这意味着它可用于计算场景中放置的虚拟光(局部照明)和从其他表面反射一次或多次的间接光(全局照明)的贡献。这也意味着BRDF独立于灯光的实现,可以单独开发和编写(BRDF只需要知道入射光的方向及其在阴影点的强度)。

渲染算法和光照的独立性意味着我们可以将这种抽象的 BRDF 实现为“材质插件”,通过简单的 API 访问,而且不同渲染器产生的视觉结果将是相同的。

物理上真实

为了使BRDF实现的效果更加逼真,一般要求提出的BRDF模型要满足以下两个条件:

Helmholtz reciprocity------入射和出射方向可以交换(因此称为双向),并且所得反射率将相同。请注意,某些算法会跟踪来自相机的光线(路径跟踪),其他算法会跟踪来自光源的光线(光子映射)或两者都追踪(双向路径跟踪)。Helmholtz reciprocity确保所有类型的算法得到一致的结果。

Energy conservation(能量守恒)------对于具有完全白色反照率且无吸收的表面,从表面反射的能量应等于接收到的能量

但是一些成功的模型并不满足这些要求。 Disney 模型不是能量守恒的,而 Autodesk 模型不一定满足Helmholtz reciprocity。迪士尼模型与单向路径追踪结合使用,缺乏双向性不会带来重大问题。完美的能量守恒也可能不是一个严格的要求,因为除非 BRDF 反射的能量多于它接收到的能量,否则不太可能造成问题,除了能量损失带来的表面变暗。

几种常见的BRDF模型

常用的向量参数讲解

矢量 是给定表面的着色法线(可能来自法线贴图)。矢量,,指定从着色点到观察者(相机)的方向,更一般地说,它指定出射光方向,在典型的路径追踪器中,这与光线方向相反。矢量 指向光源,或者根据上下文指定入射光线反射的方向。向量 ,半向量位于 和 之间。它也等于第 4 节中讨论的微表面模型的微表面法线。矢量 是矢量 沿法线 的完美镜面反射方向,矢量 是三角形平面上垂直于 的切线。所有这些向量都被标准化。向量 和 是 和 在三角形平面上的投影。 注意\(\varphi_{v} \theta_{v}\) 与\(\varphi_{l} \theta_{l}\) 是 与 的球面坐标表达。

Lambertian diffuse BRDF

朗伯函数是用于漫反射项的最简单的 BRDF 函数之一,它假设入射光在所有可能的方向上均匀散射(在表面法线周围的半球内),即是完美的漫反射。

定义为:

考虑余弦项(代表着入射光方向带来的能量的损失):

其中\(diffuseReflectance\)代表着有多少光被反射 \(PI\)是球面积分 保证能量守恒的结果

Phong Reflection Model

Phong引入了过去常与 Lambertian 一起使用的另一种流行的反射模型,为实时渲染提供计算成本低廉的镜面高光。不要将 Phong 反射模型与 Phong 着色相混淆——Phong 着色是一种用于实现平滑镜面高光的法线插值方法。虽然 Phong 的原始论文指出,他的反射模型是基于物理的,但按照今天的标准,它并不是基于物理的,因为它缺乏非镜面峰值、菲涅尔反射等现象。

定义为:

高光的宽度由指数(通常称为光泽度shinines)控制,这是一个无界参数,但通常将其范围限制在 10000 左右。为了实现 Phong 模型,我们必须计算向量 ,但正如 Blinn 在其优化版本中所示,可以使用半程向量 代替

由于它既不能量守恒也不双向,因此将其称为这种形式的“Phong BRDF”在技术上是不正确的,但是,已经有人尝试修复这些缺陷。 Blinn 推出了一个优化版本,并将 Phong 的镜面高光与朗伯漫反射和恒定环境项相结合,创建了 Blinn-Phong 反射模型,该模型成为实时应用程序的标准,直到被更先进的基于物理的模型所取代

关于其它修正的Phong模型的BRDF 可自行到原文的参考文献查阅

Oren-Nayar Diffuse Reflectance Model

Oren 和 Nayar 引入了更先进的漫反射反射模型,该模型考虑了表面粗糙度。他们的模型基于这样的观察:当视线方向接近入射光方向时,粗糙表面反射的光比Lambertian模型预测的要多(这种效应称为反向散射,这种非Lambertian表面的一个例子是月球)。 Oren-Nayar 模型通过推广朗伯模型并使其对表面粗糙度和观察方向敏感。

Oren 和 Nayar 提出了他们模型的几个版本,并进行了不同程度的简化。本文附带的代码使用最简单的“定性”模型:

粗糙度。。。。。

Disney (Burley) Diffuse Model

另一种流行且广泛使用的模型是 Disney 漫射模型,有时也称为 Burley 漫射模型。它是通过观察测量数据得出的经验模型。它类似于 Oren-Nayar 模型,但评估起来更简单。它基于 Schlick 菲涅尔近似公式(见后),并扩展了基本朗伯模型。

定义:

微表面模型

使用微面模型的 RDF 通常被称为基于物理的,以表明它们是根据物理定律(光学)设计的,而不是根据观察经验进行设计的,尽管在计算机图形学中,我们经常使用简化和近似来使计算简化。

一个著名的微表面模型Cook and Torrance :

其中各参数含义简述如下:

D 项 – 微面分布函数 – 告诉我们有多少微面面向方向 ,该方向可以将从方向 L 传入的光沿着方向 反射

F 项 – 菲涅尔项,评估给定入射角有多少光会从表面反射

G 项 – 几何衰减项(也称为掩蔽和阴影项),说明微表面的相互遮蔽,有时也用于 BRDF 的标准化

分母 – 来自使用完美镜面作为微表面的微表面模型的推导

微表面分布项 或者说微表面的法线分布函数(NDF)

常用的NDF 本文介绍了两种

一种是Beckmann:

其中\(\theta_{h}\)代表着法线与半程向量的夹角 \(\alpha\)代表着材质的粗糙率

一种是GGX:

对于上面的两个公式 我们可以将tan角使用余弦角来表示 因为余弦更加容易计算 只需要一个点积:

两者随着余弦角度变化的对比图:

从上图中可以看出 GGX有着更长的尾巴,意味着镜面高光下降的更为缓慢,更符合现实,因此GGX被更为广泛的应用

还有一个由 Blinn 使用 Phong 反射模型导出的 NDF(称为 Blinn-Phong NDF),并且在 Walter 的论文中也进行了讨论,他得出的结论是,对于某些粗糙度值,Beckmann 和 Blinn-Phong 分布非常适合相似的,这可以解释 Phong 着色模型的长寿,因为它能够准确地表示某些材料(尤其是塑料)。

正如我们所看到的,每个模型的粗糙度单位可能有很大不同。 Torrance 和 Sparrow 以及 Oren-Nayar 模型直接使用正态分布的标准差,Beckmann 和 Trowbridge-Reitz 使用斜率的统计均方根,而 Burley 使用在合理范围内根据经验选择的值。当多个 BRDF 耦合在一起时(通常是镜面反射和漫反射 BRDF),将艺术家指定的粗糙度仔细转换为底层 BRDF 使用的粗糙度单位非常重要。

几何遮挡项

几何衰减项 解释了由于微表面的几何形状而导致的反射光衰减,这种衰减是在某些微面相互遮挡时发生的。

项抵消了菲涅尔项,并导致了菲涅尔预测的高反射率因掠射角处的 项产生的显着阴影而减弱,对于某些粗糙度的材料会出现“非镜面峰值”,即峰值反射率出现在较低的角度

微表面的几何形状由用于模拟其形状的轮廓给出。有两种重要的微表面轮廓:V-Cavity模型,假设微表面由一定宽度和高度的V形凹槽组成,以及基于斜率随机分布的Smith模型。 Cook-Torrance 和 Oren-Nayar 在他们的 BRDF 中使用了 V-Cavity模型,但正如 Heitz 的一篇文章展示的,Smith 函数是更为正确的模型,因此,我们将只讨论 Smith 的函数,定义为:

其中 是 或 向量, 是微表面法线,λ 是特定于所选分布函数 (NDF) 的函数:

在考虑微表面的入射光与反射光时。我们可以发现两者均会发生遮蔽现象,所以我们的G函数会由两部分组成

如果我们考虑到微表面更深的面被阴影和遮蔽的可能性更高,还有一种更为精确的G函数提出:

任一形式的 函数 都可以用于前面介绍的微面模型反射公式中的 项,但后一种更可取,因为它只是稍微贵一点但是更准确。

菲涅尔项

菲涅耳项决定了有多少光将从表面反射,有效地告诉我们有多少光将有助于评估 BRDF。剩余部分 (1 − ) 将传递到底层材料层(例如,漫反射 BRDF 或透射 BTDF)。到目前为止,我们的实现仅讨论了两层(镜面反射和漫反射),但可以创建具有多个层的复杂材质。菲涅耳项应在光从一层传播到另一层的每个界面上进行评估。为简单起见,各个层的厚度通常为零,但可以结合光谱渲染对某些厚度进行建模,以产生诸如当层界面比穿过它的光的波长薄时发生的衍射(虹彩)等效果。

Christophe Schlick 引入了一种广泛使用的菲涅尔近似值,用于计算机图形学 。正如他指出的那样,完整的菲涅尔方程不仅计算成本昂贵,而且依赖于不直观的折射率 和消光 ,这不符合我们对可预测且易于使用的参数的需求。更复杂的是,全折射率是一个由实部(折射率)和虚部(消光系数)组成的复数,并且是按波长指定的。这不适合使用 RGB 三元组进行渲染。 Naty Hoffman 题为“被认为有害的菲涅尔方程” 的文章对该主题进行了进一步讨论,并得出结论,除非使用光谱渲染,否则完整的菲涅尔方程并不比 Schlick 近似更精确。

Schlick 近似使用这样的观察结果:在 90 度以下观察时,所有材料都表现出完美的反射率,并且我们可以仅使用一个参数 ------ 法线入射(0 度到F0度)下的表面反射率来近似完整的菲涅尔方程:

其中 是法线与观察方向之间角度的余弦 ( = ∙ ),并且 \(F_{90}\) 等于 1,除了接下来讨论的情况。请注意,折射率和消光系数已被消除,但我们现在需要指定从法线入射时的反射率\(F_{0}\)

消除折射率和消光系数简化了计算,但也导致失去对材料是否表现为电介质(低吸收系数——塑料、木材等)或导体(高吸收系数——铜、金等)的控制。正如 Cook 和 Torrance 所指出的,金属反射是根据法线入射材质的基色着色的(表示为 \(F_{0}\))。利用这些知识,我们可以通过引入一个称为金属度的参数来“修复”对于金属菲涅尔反射的颜色,该参数将 \(F_{0}\) 计算为电介质的默认反射率和金属的基色之间的混合:

\(F_{0Dielectrics}\)的常见选择是 0.04(4% 反射率),例如 UE4 和 Frostbite 使用的

混合BRDF

在本文中,为了将镜面 BRDF 与漫反射 BRDF 结合起来,我们使用一种基于菲涅耳项的简单方法,将镜面反射和漫反射 BRDF 混合在一起。请注意,微面模型已经用 衡量镜面 BRDF 的权重,因此我们可以用 (1 − ) 衡量漫反射 BRDF 的权重。这是受到分层材料的启发,其中光与每一层相互作用,菲涅耳项用于评估有多少光从表面反射以及有多少散射到表面。

games101-3 BRDF101的更多相关文章

  1. 回顾Games101图形学(一)几何变换中一些公式的推导

    回顾Games101 chatper1 - 6 前言 本文只写回顾后重新加深认识的知识 透视除法的意义 经过MVP矩阵之后,将模型空间下某点的坐标,转换成了裁剪空间下的坐标,此时因为裁剪空间的范围是x ...

  2. 回顾games101中的SSAA和MSAA

    回顾games101中的AA(抗锯齿) 前言 善于进行课后总结,可以更加巩固自己的知识和具体细节 锯齿(走样)产生的原因 本质上,在光栅化阶段中,用有限离散的数据想表示连续的(类似三角形的某一边),就 ...

  3. 【UE4】GAMES101 图形学作业2:光栅化和深度缓存

    总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...

  4. games101 - 4 - Ray Tracing

    games101 - 4 - Ray Tracing 目录 games101 - 4 - Ray Tracing 为什么需要Ray Tracing Recursive (Whitted-Style) ...

  5. 《Shader入门精要》中MVP变换的Projection矩阵与《GAMES101图形学入门》中的区别

    game101的透视投影的投影矩阵是这样的 正交投影是这样的 而shader入门精要的透视投影矩阵是这样子 正交投影矩阵是这样子 game101的透视投影是这样得到的 而正交投影的时候并没有假设中心点 ...

  6. GAMES101课程 作业6 源代码概览

    GAMES101课程 作业6 源代码概览 Written by PiscesAlpaca(双鱼座羊驼) 一.概述 本篇将从main函数为出发点,按照各cpp文件中函数的调用顺序和层级嵌套关系,简单分析 ...

  7. GAMES101系列笔记一 图形学概述与线性代数入门

    概述+线性代数 为什么学习图形学? Computer Graphics is AWESOME! 主要涉及内容: 光栅化 曲线和网格 光线追踪 动画与模拟 Differences between CG ...

  8. GAMES101作业2

    作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...

  9. 【UE4】GAMES101 图形学作业5:光线与物体相交(球、三角面)

    总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像.在光线追踪中最重要的操作之一就是找到光线与物体的交点.一旦找到光线与物体的交点,就可以执行着色并返回像素颜色. 在这次作业中,我们要实现两个 ...

  10. 【UE4】GAMES101 图形学作业4:贝塞尔曲线

    总览 Bézier 曲线是一种用于计算机图形学的参数曲线. 在本次作业中,你需要实现de Casteljau 算法来绘制由4 个控制点表示的Bézier 曲线(当你正确实现该算法时,你可以支持绘制由更 ...

随机推荐

  1. 记录-Vue移动端日历设计与实现

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 工作中遇到一个需求是根据日历查看某一天/某一周/某一月的睡眠报告,但是找了好多日历组件都不是很符合需求,只好自己手写一个日历组件,顺便记录 ...

  2. opensips的dispatcher模块笔记

    操作系统 :CentOS 7.6_x64 opensips版本:2.4.9 dispatcher模块模块实现了基于目的地址的调度功能,可用作无状态负载均衡,但不能保证均匀分配.今天整理下CentOS7 ...

  3. UE4_C++实现TimeLine

    主要实现蓝图节点中时间轴的功能. 目前UE提供了两种实现方式,一个是使用FTimeLine其是一个时间轴的结构体:另一种方式是使用UTimeLineComponent,其是一个时间轴组件类.两者内部定 ...

  4. 鸿蒙HarmonyOS实战-ArkUI组件(Swiper)

    一.Swiper 1.概述 Swiper可以实现手机.平板等移动端设备上的图片轮播效果,支持无缝轮播.自动播放.响应式布局等功能.Swiper轮播图具有使用简单.样式可定制.功能丰富.兼容性好等优点, ...

  5. 【已解决】linux安装mysql依赖包(mysql-community-common-5.7.35-1.el7.x86_64)冲突

    错误信息: 软件包 mysql-community-common-5.7.35-1.el7.x86_64 (比 mysql-community-common-5.7.28-1.el7.x86_64 还 ...

  6. windows下安装SASS

    window下安装ruby与sass(附ruby) webstorm设置sass自动编译,及参数配置 安装sass以及如何在sublime里使用 sublime text 3 配置sass环境 sub ...

  7. 运维排查 | Systemd 之服务停止后状态为 failed

    哈喽大家好,我是咸鱼. 我们知道 CentOS 7 之后,Systemd 代替了原来的 SystemV 来管理服务,相比 SystemV ,Systemd 能够很好地解决各个服务间的依赖关系,还能让所 ...

  8. #树,搜索#NOIP2020.9.26模拟tom

    分析 考虑最极端的情况也就是TOM天天吃早餐肠或者晚餐肠, 那么早餐肠和晚餐肠应分别构成一个互不相交连通块, 所以题目转换成是否有一个点的子树大小为\(a\)或\(b\), 将这个点与它父亲的边断开就 ...

  9. 驾考宝典携手HMS Core统一扫码服务,构建复杂场景中的流畅扫码体验

    "驾考宝典"是一款颇具人气的互联网综合驾照考试学习应用,通过强大的驾考功能,在手机移动端为学车学员提供从报名.学习到拿本的全方位驾考服务.作为一个专业的驾培平台,"驾考宝 ...

  10. 【直播回顾】Hello HarmonyOS系列应用篇完美收官!

    6月15日晚上19点,Hello HarmonyOS系列应用篇第七期直播 <分布式应用开发>,在HarmonyOS社群内成功举行.随着本系列直播最后一课的完美收官,开发者们在逐渐掌握技术知 ...