前言

  因为前边讲了在Unity中如何实现一个BRDF——简单来说就是把公式抄到Shader里,于是这篇文章则主要从原理角度来讲一讲基于物理的BRDF公式为什么长那个样子。本篇文章主要是整理一下去年(2022)十二月底写的关于基于微平面理论的BRDF的一些东西,主要依据的是两篇经典论文:一篇是Cook-Torrance模型的A Reflectance Model for Computer Graphics[1982],另一篇则是GGX模型Microfacet Models for Refraction through Rough Surfaces[2007](这篇论文的作者里也有我的导师…真要说的话本篇文章内容的由来还有一些故事)。

  原本计划中应该还有两三篇文章,但这可能是这几天(或者很长一段时间)的最后一篇了,连更几篇确实把我写累了(倒),而且因为一直忙着整理以前的东西,导致我这几天的作业也还没写,导师的项目也几天没动了(其实也是因为还有一些进度存货) 。

BRDF

  双向反射分布函数(Bidirectional Reflectance Distribution Function,BRDF)描述了物体表面入射光与反射光的关系,具体从定义上来说是出射方向Radiance与入射方向Irradiance的比值,这里也简单补上辐射度量学里的相关定义:

  • 辐射能量(Radiant Energy):电磁辐射的能量, Q Q Q
  • 辐射通量/功率(Radiant Flux/Power):单位时间内通过某一区域的能量, Φ = d Q d t \Phi = \frac{dQ}{dt} Φ=dtdQ​
  • 辐射强度(Radiant Intensity):单位立体角内的辐射通量, I ( ω ) = d Φ d ω I(\omega) = \frac{d\Phi}{d\omega} I(ω)=dωdΦ​
  • 辐射照度(Irradiance):单位面积内的辐射通量, E ( x ) = d Φ ( x ) d A E(x) = \frac{d\Phi(x)}{dA} E(x)=dAdΦ(x)​
  • 辐射亮度(Radiance):单位立体角、单位投影面积内的辐射通量, L ( p , ω ) = d 2 Φ ( p , ω ) d ω d A c o s θ L\left( {p,\omega} \right) = \frac{d^{2}\Phi(p,\omega)}{d\omega dAcos\theta} L(p,ω)=dωdAcosθd2Φ(p,ω)​


  这时候我们再来看渲染方程, L i ( p , ω i ) n ⋅ ω i d ω i L_{i}\left( {p,\omega_{i}} \right)n \cdot \omega_{i}\mathbb{d}\omega_{i} Li​(p,ωi​)n⋅ωi​dωi​其实算的就是入射方向的Irradiance d E ( ω i ) {d}E(\omega_{i}) dE(ωi​),中间的点乘是因为入射的角度不同接收到的能量就不同。

而 f r ( p , ω i , ω o ) L i ( p , ω i ) n ⋅ ω i d ω i f_{r}\left( {p,\omega_{i},\omega_{o}} \right)L_{i}\left( {p,\omega_{i}} \right)n \cdot \omega_{i}\mathbb{d}\omega_{i} fr​(p,ωi​,ωo​)Li​(p,ωi​)n⋅ωi​dωi​就是从这个方向入射的Radiance经过物体表面后又有多少被分配至出射方向,于是这么一积分再加上自身自发光的Radiance便是我们要的出射方向的Radiance,这也就是BRDF的作用。

L o ( p , ω o ) = L e ( p , ω o ) + ∫ Ω f r ( p , ω i , ω o ) L i ( p , ω i ) n ⋅ ω i d ω i L_{o}\left( {p,\omega_{o}} \right) = L_{e}\left( {p,\omega_{o}} \right) + \int_{\Omega}^{~}{f_{r}\left( {p,\omega_{i},\omega_{o}} \right)L_{i}\left( {p,\omega_{i}} \right)n \cdot \omega_{i}\mathbb{d}\omega_{i}} Lo​(p,ωo​)=Le​(p,ωo​)+∫Ω ​fr​(p,ωi​,ωo​)Li​(p,ωi​)n⋅ωi​dωi​

微平面理论与Cook-Torrance

  回到BRDF本身,基于物理的BRDF基本理论便是微平面理论,其认为物体的宏观表面由一个个微小的表面组成,光线在微平面上发生理想镜面反射或折射,微平面分布越粗糙,物体高光越模糊:

宏观表面法线方向为n,微观表面法线方向为m  

  一个经典的基于微平面理论提出的BRDF模型就是Cook-Torrance模型,其BRDF项包含了漫反射 R d R_{d} Rd​和镜面反射 R s R_{s} Rs​两部分,可以看到公式结构与之前实现里提到的GGX公式基本相同,不同的地方在于 R s R_{s} Rs​项Cook-Torrance分母中为 π \pi π而GGX为 4 4 4,之后普遍认为这里取 4 4 4更加合理:
R = s R s + d R d R = sR_{s} + dR_{d} R=sRs​+dRd​

R s = F π D G ( N ⋅ L ) ( N ⋅ V ) R_{s} = \frac{F}{\pi}\frac{DG}{({\mathbf{N}} \cdot {\mathbf{L}})({\mathbf{N}} \cdot {\mathbf{V}})} Rs​=πF​(N⋅L)(N⋅V)DG​


其中镜面反射描述了从物体表面反射出去的光,而漫反射本质上与次表面散射相同(在Cook-Torrance的论文中,认为漫反射也包含了当表面足够粗糙时光在物体微表面的多次弹射,因为从下文就可以看到,镜面反射中没有考虑到多次弹射的反射现象。而现在似乎有单独对其进行的研究,粗糙度改变时能量应该守恒),都是在进入物体表面后散射出去的光,不同的是相对于渲染像素的距离:如果光线在同一像素内进入并离开则被认为是漫反射,不同像素则认为是次表面散射。

  对于漫反射,通常都采用归一化(归一化是为了保证能量守恒,当漫反射强度系数为1时,进入的能量等于出去的能量)的Lambert漫反射模型,模型虽然简单同时也没有考虑菲涅尔反射系数对入射光数量的影响,但效果很好,其公式如下:

R d = 1 π R_{d} = \frac{1}{\pi} Rd​=π1​

菲涅尔项F

  菲涅尔项描述了一个现象,视线与物体表面夹角越小(越接近掠射角)反射越强,如近处的海面可以看到水面以下的东西,而远处的海面则反射出天空的颜色(实质上菲涅尔反射系数是描述了对于一份光,有多少进入了物体表面,又有多少在物体表面被直接反射)。对于同一种材质,在不同波长下,其强度可能不同,这也是为什么金属的高光会有颜色。


通常我们采用一个近似公式来进行描述,其中 F 0 F_{0} F0​为入射角为0时的菲涅尔反射率,通常金属较高,而非金属较低。注意宏观表面的菲涅尔反射效应是由微观表面菲涅尔反射产生的,在公式的表现上就是公式描述了微观表面(理想表面)下的菲涅尔反射(取 m \mathbf{m} m的原因),并通过推导成为了宏观BRDF公式的一部分:
F S c h l i c k ( i , m ) = F 0 + ( 1 − F 0 ) ( 1 − ( i ⋅ m ) ) 5 F_{Schlick}\left( {{\mathbf{i}},{\mathbf{m}}} \right) = F_{0} + \left( 1 - F_{0} \right)\left( 1 - ({\mathbf{i}} \cdot {\mathbf{m}}) \right)^{5} FSchlick​(i,m)=F0​+(1−F0​)(1−(i⋅m))5

法线分布函数D

  法线分布函数描述了微平面法线 m \mathbf{m} m的统计分布。 D ( m ) D({\mathbf{m}}) D(m)是一个密度函数,其定义如下:以 d ω m \mathbb{d}\omega_{m} dωm​表示以m为中心的无限小的立体角, d A \mathbb{d}A dA表示一个无限小的宏观面积,则 D ( m ) d ω m d A D({\mathbf{m}})d\omega_{m}dA D(m)dωm​dA表示法线位于立体角内的对应微表面的总面积。下边是一些性质:

  • 0 ≤ D ( m ) ≤ ∞ 0 \leq D({\mathbf{m}}) \leq \infty 0≤D(m)≤∞
  • 1 ≤ ∫ D ( m ) d ω m 1 \leq \int{D({\mathbf{m}})d\omega_{m}} 1≤∫D(m)dωm​,微表面面积大于等于对应的宏观表面面积
  • ( v ⋅ n ) = ∫ D ( m ) ( v ⋅ m ) d ω m \left( {{\mathbf{v}} \cdot {\mathbf{n}}} \right) = \int{D({\mathbf{m}})\left( {{\mathbf{v}} \cdot {\mathbf{m}}} \right)d\omega_{m}} (v⋅n)=∫D(m)(v⋅m)dωm​,两者投影面积相同
  • ∫ D ( m ) ( n ⋅ m ) d ω m = 1 \int{D({\mathbf{m}})\left( {{\mathbf{n}} \cdot {\mathbf{m}}} \right)d\omega_{m}} = 1 ∫D(m)(n⋅m)dωm​=1,即上式中 v \mathbf{v} v与 n \mathbf{n} n重合的特殊情况,也就是归一化,保证能量守恒

投影面积相同  

  常见如Phong分布、Beckmann分布、GGX(Trowbridge-Reitz)分布,其实都是在尝试用函数来近似拟合物体表面的法线分布情况,其公式分别如下(均做了归一化处理,主要就是为了保证能量守恒,其中Cook-Torranc采用的便是未归一化的Beckmann分布):

  • Phong分布: D ( m ) = α + 2 2 π c o s α θ D({\mathbf{m}}) = \frac{\alpha + 2}{2\pi}{cos}^{\alpha}\theta D(m)=2πα+2​cosαθ, c o s θ = ( n ⋅ m ) cos\theta = ({\mathbf{n}} \cdot {\mathbf{m}}) cosθ=(n⋅m)
  • Beckmann分布: D ( m ) = 1 π α 2 c o s 4 θ e − ( t a n θ α ) 2 D({\mathbf{m}}) = \frac{1}{\pi\alpha^{2}{cos}^{4}\theta}e^{- {(\frac{tan\theta}{\alpha})}^{2}} D(m)=πα2cos4θ1​e−(αtanθ​)2, c o s θ = ( n ⋅ m ) cos\theta = ({\mathbf{n}} \cdot {\mathbf{m}}) cosθ=(n⋅m)
  • GGX分布: D ( m ) = α 2 π c o s 4 θ ( α 2 + t a n 2 θ ) 2 D({\mathbf{m}}) = \frac{\alpha^{2}}{\pi{cos}^{4}\theta\left( \alpha^{2} + {tan}^{2}\theta \right)^{2}} D(m)=πcos4θ(α2+tan2θ)2α2​, c o s θ = ( n ⋅ m ) cos\theta = ({\mathbf{n}} \cdot {\mathbf{m}}) cosθ=(n⋅m)

不同分布函数对比,其中绿色为GGX,明显具有更长的尾部  

阴影遮蔽函数G

  阴影遮蔽项描述了光线被物体微平面遮挡的情况。阴影指入射光方向的遮挡,遮蔽指出射光方向的遮挡,其具有的一些性质如下:

  • 0 ≤ G ( i , o , m ) ≤ 1 0 \leq G({\mathbf{i}},{\mathbf{o}},{\mathbf{m}}) \leq 1 0≤G(i,o,m)≤1,小于等于1同样是保证能量守恒
  • G ( i , o , m ) = G ( o , i , m ) G\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{m}}} \right) = G({\mathbf{o}},{\mathbf{i}},{\mathbf{m}}) G(i,o,m)=G(o,i,m),交换入射与出射方向遮挡系数不变
  • G ( i , o , m ) = 0 G\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{m}}} \right) = 0 G(i,o,m)=0,当 ( i ⋅ m ) ( i ⋅ n ) ≤ 0 ({\mathbf{i}} \cdot {\mathbf{m}})({\mathbf{i}} \cdot {\mathbf{n}}) \leq 0 (i⋅m)(i⋅n)≤0或 ( o ⋅ m ) ( o ⋅ n ) ≤ 0 ({\mathbf{o}} \cdot {\mathbf{m}})({\mathbf{o}} \cdot {\mathbf{n}}) \leq 0 (o⋅m)(o⋅n)≤0,即微表面的背面在宏观表面正方向上不可见

  GGX中采用了Smith阴影遮蔽函数,将双向阴影遮蔽 G G G近似为两个单向阴影项 G 1 G_1 G1​的可分离乘积:
G ≈ G 1 ( i , m ) G 1 ( o , m ) G \approx G_{1}({\mathbf{i}},{\mathbf{m}})G_{1}({\mathbf{o}},{\mathbf{m}}) G≈G1​(i,m)G1​(o,m)
   G 1 G_1 G1​是从法线分布函数D推导得出的,GGX分布推导出Smith G 1 G_1 G1​如下:
G 1 ( v , m ) = 2 1 + 1 + α 2 t a n 2 θ , c o s θ = ( v ⋅ n ) G_{1}\left( {{\mathbf{v}},{\mathbf{m}}} \right) = \frac{2}{1 + \sqrt{1 + \alpha^{2}{tan}^{2}\theta}},cos\theta = ({\mathbf{v}} \cdot {\mathbf{n}}) G1​(v,m)=1+1+α2tan2θ ​2​,cosθ=(v⋅n)

GGX公式推导

  有了上边这些项的定义,就可以利用微平面的理想镜面反射推导宏观粗糙表面BRDF,通过积分对应微面元的贡献计算宏观BRDF(当然,GGX其实提出的是一个完整的BSDF模型,这里只讲其BRDF部分):
f r ( i , o , n ) = ∫ ∣ i ⋅ m i ⋅ n ∣ f r m ( i , o , m ) ∣ o ⋅ m o ⋅ n ∣ G ( i , o , m ) D ( m ) d ω m f_{r}\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{n}}} \right) = \int{\left| \frac{{\mathbf{i}} \cdot {\mathbf{m}}}{{\mathbf{i}} \cdot {\mathbf{n}}} \right|f_{r}^{m}\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{m}}} \right)\left| \frac{{\mathbf{o}} \cdot {\mathbf{m}}}{{\mathbf{o}} \cdot {\mathbf{n}}} \right|G\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{m}}} \right)D({\mathbf{m}})d\omega_{m}} fr​(i,o,n)=∫ ​i⋅ni⋅m​ ​frm​(i,o,m) ​o⋅no⋅m​ ​G(i,o,m)D(m)dωm​

其中 ∣ i ⋅ m i ⋅ n ∣ \left| \frac{{\mathbf{i}} \cdot {\mathbf{m}}}{{\mathbf{i}} \cdot {\mathbf{n}}} \right| ​i⋅ni⋅m​ ​, ∣ o ⋅ m o ⋅ n ∣ \left| \frac{{\mathbf{o}} \cdot {\mathbf{m}}}{{\mathbf{o}} \cdot {\mathbf{n}}} \right| ​o⋅no⋅m​ ​为宏观表面与微面元之间转换的系数,这与之前提到的辐射度量学的相关定义有关,因为微平面的法线与宏观表面的法线可能并不相同。其中:
f r m ( i , o , m ) = F ( i , m ) δ ω m ( h , m ) 4 ( i ⋅ h ) 2 f_{r}^{m}\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{m}}} \right) = F({\mathbf{i}},{\mathbf{m}})\frac{\delta_{\omega_{m}}\left( {\mathbf{h}},{\mathbf{m}} \right)}{4\left( {\mathbf{i}} \cdot {\mathbf{h}} \right)^{2}} frm​(i,o,m)=F(i,m)4(i⋅h)2δωm​​(h,m)​

δ ω m ( h r , m ) \delta_{\omega_{m}}\left( {\mathbf{h}}_{r},{\mathbf{m}} \right) δωm​​(hr​,m)为狄拉克函数,当 h = m {\mathbf{h}} = {\mathbf{m}} h=m时为无穷大,否则为0,也就是只有镜面反射方向不为0,或者说只有 m \mathbf{m} m与 h \mathbf{h} h重合的微平面才会对宏观BRDF产生贡献(也能用来理解为什么 m \mathbf{m} m最后被换成了 h \mathbf{h} h),其性质如下(g为任意函数):

∫ Ω g ( o ) δ ω o ( s , o ) d ω o = { g ( s ) , i f s ∈ Ω 0 , 其他 \int_{\Omega}^{~}{g({\mathbf{o}})\delta_{\omega_{o}}\left( {{\mathbf{s}},{\mathbf{o}}} \right)d\omega_{o} = \left\{ \begin{matrix}{g({\mathbf{s}}),~if{\mathbf{s}} \in \Omega} \\ {0,其他} \\ \end{matrix} \right.} ∫Ω ​g(o)δωo​​(s,o)dωo​={g(s), ifs∈Ω0,其他​

这个公式实际上是经过一定推导得来的,因为考虑镜面反射,所以 i ⋅ h \mathbf{i} \cdot \mathbf{h} i⋅h和 o ⋅ h \mathbf{o} \cdot \mathbf{h} o⋅h相同,以及狄拉克函数为了进行积分然后换元时产生的雅可比行列式,于是才有了分母中的式子,对详细的数学推导感兴趣的话可以看原论文。这里补充上狄拉克函数的

  现在我们将刚刚提到的式子代入上方进行积分,就得到了我们常见的这个BRDF公式:
f r ( i , o , n ) = F ( i , h ) G ( i , o , h ) D ( h ) 4 ∣ i ⋅ n ∣ | o ⋅ n ∣ f_{r}\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{n}}} \right) = \frac{F\left( {{\mathbf{i}},{\mathbf{h}}} \right)G\left( {{\mathbf{i}},{\mathbf{o}},{\mathbf{h}}} \right)D({\mathbf{h}})}{\left. 4\left| {{\mathbf{i}} \cdot {\mathbf{n}}} \right| \middle| {\mathbf{o}} \cdot {\mathbf{n}} \right|} fr​(i,o,n)=4∣i⋅n∣∣o⋅n∣F(i,h)G(i,o,h)D(h)​

基于微平面理论的BRDF模型(PBR材质、Cook-Torrance、GGX)相关推荐

  1. 光线追踪渲染实战(四):微平面理论与迪士尼 BRDF,严格遵循物理!

    项目代码仓库: GitHub:https://github.com/AKGWSB/EzRT gitee:https://gitee.com/AKGWSB/EzRT 目录 前言 0. 前情回顾 1. 微 ...

  2. 20、计算机图形学——微平面理论和Cook-Torrance BRDF

    一.微平面理论 如下图中的海面,从远处看,就像镜子一样平整,反光很强烈 但是从近处看,却能法线,海平面是有微小的凹凸不平.可以认为,海平面是由无数个微小的镜面组成,而每个微小的镜面都有法线 如果法线的 ...

  3. games101:作业7+Microfacet微平面理论+cook-torranceBRDF方程计算+作业7拓展

    games101:作业7+Microfacet微平面理论+cook-torranceBRDF方程计算+作业7拓展 一,作业7 1.1 代码部分 1.2 加入多线程 二,Microfacet微平面理论 ...

  4. 基于贝兹理论的风力机模型及其仿真

    根据贝兹理论和空气动力学,风力机从风能中捕获并输出的功率Pw和输出的转矩Tw为: 式中,ρ为空气密度,常取1.225kg/m3,R为风轮半径,单位为m:λ为风机叶尖速比:v为风速,单位为m/s:ωm为 ...

  5. Unity URP管线的PBR材质及Tessallation Shader(Height Map高度贴图)

    在使用URP管线的过程中发现默认的URP管线的shader是没有提供height map参数设置的,经过查找才知道URP管线中height map相关的功能需要自己写shader开启Tessallat ...

  6. 源码分析学习记录(9)——PBR材质

    2021SC@SDUSC Dust3D中的材质采用PBR模型.PBR就是Physically-Based Rendering的缩写,意为基于物理的渲染.它提供了一种光照和渲染方法,能够更精确的描绘光和 ...

  7. 【LearnOpenGL】-PBR材质

    PBR,或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合.正因 ...

  8. 3D图形学(5):BRDF经验模型和基于物理的BRDF模型

    内容引自<Real Time Rendering 3rd> 一.BRDF 双向反射分布函数 在计算机图形学中,BRDF(Bidirectional Reflectance Distribu ...

  9. 【技术美术图形部分】2.2 模型与材质基础

    记录之前膜拜一下这节课的大佬,才大三,我一个研二菜狗留下不学无术的泪水! May佬提到,这次课程安排的目的是给美术同学一个缓冲的空间,我的话在写这篇学习笔记就尽量加入一些自己的理解. 友情提示!才发现 ...

最新文章

  1. sersync 文件同步系统(一) 服务初步搭建
  2. python 服务端与c++客户端通讯_[原创]python socket 服务端 与 c++客户端通讯,发包内容加密,支持大文件,并发...
  3. js动态添加控件服务器响应,JS实现动态给标签控件添加事件的方法示例
  4. 11.15scrum会议
  5. Linux下套接字详解(四)----简单的TCP套接字应用(迭代型)
  6. tcp和icmp测速哪个好_ping icmp和tcp区别:
  7. 关于JAVA输入输出流造成的Runtime线程阻塞问题【新人笔记】
  8. 斐波那契java_递归之斐波那契数列java的3种方法
  9. Delphi 10.4.2 CE 社区版支持 Android API-30,之二
  10. 基于python的饭店点餐外卖管理系统#毕业设计
  11. 差生的 8 年程序员总结
  12. 重装Ubuntu系统
  13. 微型计算机升级换代的两种,嵌入式的LED点阵显示屏的研究与实现
  14. Jenkins自动构建部署项目
  15. mysql的环境配置
  16. mbedtls安装的心路历程
  17. 计算机用户被禁用,administrator账户被停用怎么办【图文教程】
  18. Linux部署Oracle11gR2 RAC详细教程
  19. Matlab系列之变量
  20. Anaconda 大疆 Tello EDU python 环境配置

热门文章

  1. 直播多人连麦技术浅谈
  2. Android 开源USB读写demo,实现串口通信
  3. pppoe拨号后ubuntu任务栏无线网络图标消失解决方法
  4. Java爬虫爬取王者荣耀皮肤
  5. navicat for mysql 1862_navicat出现1862错误怎么办
  6. linux的grub界面退出,linux 退出grub
  7. v-for 循环数组
  8. 线上MySQL死锁分析——索引设置不当导致的死锁
  9. 职场神器:只需三分钟,让ChatGPT帮我写周报
  10. npm yarn 安装 vue