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. Web Audio API 第2章 完美的播放时机控制

    Web Audio API 第2章 完美的播放时机控制 相较于 标签, Web Audio API 拥有低延迟精确定时模型. 低延时对于游戏或交互式应用来说非常重要,因为交互操作时要快速响应给用户的听 ...

  2. 开发必会系列:JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

  3. Win10 如何在桌面显示我的电脑

    Win10桌面右键鼠标,然后在弹出来的选项中选择个性化. 选择了个性化后会弹出设置界面,在设置中选择[主题] 找到[桌面图标设置] 点击[桌面图标设置],会弹出一个对话框,该对话框有可以设置显示的图标 ...

  4. 初学 FSMC - 外扩SRAM(三)

    1. FSMC相关函数 //FSMC初始化 void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct); //FSMC ...

  5. #珂朵莉树#CF896C Willem, Chtholly and Seniorious

    题目 支持区间加,区间推平,询问区间第\(k\)小, 以及询问区间\(\sum{a_i^x}\pmod y\),数据随机 分析 由于数据随机,那么区间推平的概率为\(\frac{1}{4}\), 考虑 ...

  6. Java中IO和NIO的本质和区别

    目录 简介 IO的本质 DMA和虚拟地址空间 IO的分类 IO和NIO的区别 总结 简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外 ...

  7. 带你走进红帽企业级 Linux 6体验之旅(安装篇)

    红帽在11月10日发布了其企业级Linux,RHEL 6的正式版(51CTO编辑注:红帽官方已经不用RHEL这个简称了,其全称叫做Red Hat Enterprise Linux).新版带来了将近18 ...

  8. nginx重新整理——————http 模块中的请求过程[十一]

    前言 简单介绍一下http的一些指令. 正文 一般http的嵌套规则是这样的: http{ upstream{} split_clients {} map{} gep{} server{ if(){} ...

  9. jenkins 持续集成和交付 —— 参数化构建(八)

    前言 这个其实就是我们构建的脚本时候希望能有一些变量,能给我们更多的选择. 正文 选择这个: 填好后,这边就有一个参数配置: 那么接下来就是把变量放到我们的脚本中. 如下: 脚本变成变量符,这样就ok ...

  10. 重新整理asp.net core 实操篇——简介

    前言 实操篇和底层刨析分开的,<重新整理.net core 计1400篇>是探索底层概念. 介绍asp.net core之前先介绍.net core. .NET Core 是一个通用的开放 ...