【cg】【pbr】基于物理的渲染理论篇
辐射度量学
辐射度量学是用来研究电磁辐射能量的科学。所以在这里,PBR
使用辐射度量学的一些概念作为能量的表述单位,从而使得到的公式在能量方面得到定量的准确度。要想理清PBR的理论,就不得不明白辐射度量学的一些基本概念。
立体角
立体角,solid angle
,我们使用ω
来表示。它表示光束发散或会聚的程度,是一个光锥投射到单位球体表面上的表面积。
如果我们以光锥的基点为球心作一个球体表面,那么立体角的定义就是锥体在球体表面的截取部分的表面积(记为\(dS\))与球体半径(记为r平方的比值。如下。
其中 \(\theta\) 为以垂直轴为原轴的pitch
角度增量,而 \(\phi\) 则为yaw
角度增量。可参考下图理解。
立体角
立体角的单位为球面度sr
。
那么物体从整个空间接收能量的立体角就是
。但是我们面对的通常都不是一个通透的点,而是一个有方向的平面,它最多只能接收一半空间的辐射能。所以一个表面从整个空间接收辐射能的立体角就是
这个一半空间便是此平面对应的半球领域,即hemisphere
。
立体角可以理解为一个带有体积的方向。如下图所示。
带有体积的方向
此立体角可以表示一束光,这束光从某个方向照到平面中心,这是光的方向。而立体角则表示这束光在单位球体
上的表面积,光束越粗,表面积越大。所以说立体角可以很好地将一束光模拟成一个带有体积的方向。
辐射能
辐射能是辐射能量在一段体积、一段时间、一段方向上的积累。是辐射的能量值。单位焦耳(J)
。这里使用\(Q\)来表示。
我们分别用下面的三个度量来表示其进一步的分布特性。
辐能密度
用来表示辐射能的空间特性。
辐射通量
用来表示辐射能的时间特性。
辐射强度
用来表示辐射能的方向特性。
有了辐射能及上面这些基本概念之后,我们还无法直接和进行光照计算的光照强度直接联系起来。接下来需要做的是将光的传播方向与其照射到的平面的法线方向联系起来,从而推导出真正的光照强度。
而辐射亮度
和辐射照度
所做的就是这件事情。
辐射亮度
光源投射到一个平面时,与平面法线的夹角不同,则投射到平面上的能量也不同。而辐射亮度需要解决这种方向上的差异,所以它的定义是光源投射到与光源方向所垂直的平面上发出的辐射通量。
其中
为光源投射平面在光源方向的垂直方向的投影。可参考下图理解。
垂直方向的投影平面
辐射亮度又称辐射度
或辐射率(radiance)
。
辐射照度
从定义就可以看出。辐射照度与辐射亮度的区别是,辐射照度没有考虑光源的方向,也没有考虑平面的方向,而是对于所有的方向(半球领域)
来说的。所以可以说它是辐射亮度在半球领域对立体角
的积分。而辐射亮度则是辐射照度在某个单位立体角上的微分。
BRDF与渲染方程
BRDF
BRDF全称双向反射分布函数(Bidirectional Reflective Distribution Function)。
在现实生活中,我们人眼所看到的一个表面,实际上是所有辐射到它上面的光,再反射到我们的眼睛里来。而BRDF所描述的就是这个反射光强与入射光强的关系。
这是因为E是总的辐射照度,它既不考虑入射光的方向,也不考虑出射光的方向,即入射出射都为整个半球领域,而\(dE\)是\(E\)的积分,它考虑了入射方向,即入射为某个方向,而出射是整个半球领域。
同时,L是入射光来自整个半球领域时的辐射亮度,所以它也要对
进行微分,而它本身便是关于\(\vec{v}\)的一个微分,所以它的入射和出射都是某个方向。
由此可见,分子比分母少了一个半球领域(出射也是某个方向),那么单位是
自然说的通了。
反射率方程
微平面与能量守恒
微平面
微平面(microfacets)
即微观尺度的平面。PBR
的理论都是基于微平面的。
在宏观平面中,一个平面总是平滑的,其法线在此平面的处处都相等且都垂直于该平面。
但是从微观的角度来看,这个平面由许多肉眼看不到的微小平面组成,这些微小平面的方向(法线)各不相同。
我们使用粗糙度(roughness)
来表示一个宏观平面中微平面方向不相同的程度,即宏观平面的粗糙程度。
粗糙度
一个平面越粗糙,则这个平面上的微平面的排列就越混乱。从而产生分布更广的镜面反射。反之则会产生更尖锐的镜面反射。
借鉴Blinn_Phong
模型,如果半程向量(halfway vector)
与法线的方向一致,则镜面反射光线正好进入人眼。那么,对于一个给定的半程向量,这种方向一致的法线越多,镜面反射光线进入人眼的比例越多,我们就可以说这个平面越光滑,反之越粗糙。
而粗糙度(roughness)
就是用来计算半程向量与微平面的法线方向一致的概率的。粗糙度越小越一致,平面越光滑。
粗糙度的取值范围为[0.0, 1.0]
。
能量守恒
为了得到更真实的光照计算,以及统一光照强度的单位,PBR需要遵守能量守恒定律。
我们将一束照射到平面的光分为两部分,反射和折射。
对于反射部分,则是直接反射出去,不会进入平面内部的光,也就是镜面光照。
对于折射部分,则会进入平面内部,与平面材料的微粒进行碰撞,将光能转化为动能。
所以说,出射光的反射光线
和折射光线
加起来会等于入射光线
。假设反射光的比例系数为 \(k_s\) ,那么折射光的比例系统便为1.0-k_s。
其中反射光线即为镜面光照。而折射光线有的会被吸收,有的则重新从平面再反射出来,重新反射出来的便是次表面散射。次表面散射出的光线组成了光照的漫反射部分
,下面解释这句话。
次表面散射
折射进入平面内部的光线,在内部经多次粒子碰撞之后,会重新从平面射出,这便是次表面散射,如下图所示。
次表面散射
从宏观角度来看,次表面散射需要另外的方法重新建模。此时光线会从另外一个平面射出。如下图所示。
宏观尺度的次表面散射
但是从微观角度来看,次表面散射的实质就是漫反射。因为光线并没有逃出我们的观察点,只不过不是直接反射的方向
而已,所以我们会说次表面散射出来的光组成了光照的漫反射部分。如下图所示。
金属性
并非所有的物质的折射光都会转化为次表面散射,对于金属而言,所有的折射光都会被直接吸收而不会散开。
除此之外,金属的菲涅尔现象
也与电介质或者非金属不同。为了更真实地模拟金属以及更多现实中的材质,需要引入金属度(metallic)
作为参数来调节光照效果。
Cook-Torrance BRDF
事实上,Blinn_Phong
模型本质上也是一个brdf模型
,只不过它不满足能量守恒,且不是基于微平面的,并不是一个基于物理的brdf模型。
而我们这里使用的模型称为Cook-Torrance模型
,它是一个基于物理的brdf模型
,自1981年被Cook-Torrance引入图形学领域之后,一直被作为基于物理渲染的标准框架模型。
下面介绍该模型的一些基本概念以及最终的推导过程。
法线分布函数
法线分布函数
关于法线分布函数的建模,大都是基于统计学来估算的,或者基于显微镜下某种特定材质的表面形状特性来建模决定的。
几何分布函数
事实上,并非所有的法线方向与\(\vec{h}\)相同的微平面都会将光线反射进人眼。如下图所示。
如图所示,微平面本身的凹凸不平可能会导致自身的遮挡而反射不出去光线。
其中有的微平面是因为接收不到入射光,造成几何阴影,如左图。
有的是因为反射的光线被其他的微平面所遮蔽,造成几何遮蔽,如中图。
有的则可以正常反射出去,形成宏观平面的漫反射光照,如右图。
关于几何函数的建模,也是基于统计学来估算的,或者基于显微镜下某种特定材质的表面形状特性来建模决定的。
菲涅尔方程
在上文能量守恒
小节中我们提到过,入射的光线可以分为反射光和折射光两个部分。而菲涅尔方程的作用就是可以得到反射的光线占总光线的比例
。而且这个比例随我们的观察方向
\(\vec{v}\)的不同而不同。
但是真实的菲涅尔方程十分复杂,这里是使用Fresnel-Schlick
近似法求到的。
Cook-Torrance BRDF 的推导
有了上面这些概念,我们就可以尝试推导Cook-Torrance BRDF模型
公式。
我们将Cook-Torrance BRDF
分为两个部分,一个是Lambert漫反射项
,一个才是Cook-Torrance
镜面反射项。
Lambert项的推导
对于漫反射项,我们直接使用Lambert漫反射定律
,可参考笔者的另一篇介绍Blinn_Phong光照模型的文章(好像还没有写)。
Cook-Torrance项的推导
Cook-Torrane项最终的结果形式如下。
这里之所以把二重微分变为一重,是因为出射辐射通量不需要积分,只是某个方向上的辐射通量而已。
(1.28)便是出射辐射通量的最终形式了。
有了出射辐射通量,我们就可以进一步求得出射辐射亮度了。
下面来证。
\(^o^)/
的推导
然后我们就可以利用一些小小的数学技巧来计算这两个面积的比值,而非两个立体角的比值。
dh/dv的推导
证毕。
\(^o^)/
但是这里只是在某篇上古论文里看到的一种解法,其中尚有些不解之处,听说真正的数学证法是利用雅克比换元法
进行换元得出行列式,再进行化简,具体过程需要等以后更强大了再来了解,暂时先认为上面这种解决是正确的。
结语
本文系统详细地介绍了实现PBR的理论知识,使用了40个公式,对辐射度量学基础、BRDF与渲染方程、微平面、能量守恒以及Cook-Torrance BRDF
的证明都都进行了详细的整理。
但是限于笔者水平十分有限,有的地方难免会有些曲解,希望有人发现了可以及时指正,不胜感激。
到此为止,便可认为具备了实现PBR的理论基础,后面两篇博文将重点整理一下以这些理论为基础对PBR模型的实现细节,包括直接光照
和基于IBL(Image Based Lighting)
的间接光照
。
相关文章
- Java项目毕业设计:基于springboot+vue的电影视频网站系统「建议收藏」
- 基于Windows的安全帽识别算法「建议收藏」
- DeepLog:基于深度学习的系统日志异常检测与诊断
- 坚如磐石:TiDB 基于时间点的恢复(PiTR)特性优化之路丨6.5 新特性解析
- 基于超级SIM的新一代安全产品崛起,构建零信任网络安全防护体系
- 真实飞行条件下使用六干电极EEG系统基于ERP和功率谱以监测飞行员的精神负荷
- 操作系统大赛:基于 eBPF 的容器监控工具 Eunomia 初赛报告(系统设计、ebpf 探针设计)
- 2022 IoTDB Summit:阿里白渐《迈向物联网时代大数据计算平台——MaxCompute 基于IoTDB构建解决方案》
- 智慧动物园基于SkeyeVSS技术的解决方案
- 基于 Redis 的实时排名体系(redis实时排名)
- Art of Illusion是一个用Java语言写成的基于GPL v2的开源三维建模和渲染软件,可以创建高质量的具有真实感的三维模型。它使用方便,可以对纹理和材料等效果进行编辑,可以产生具有真实感的图像。
- K-3D是基于GNU/Linux和Win32的一个三维建模、动画和绘制系统,是一款免费、开放原始码的 3D 模型和动画制作与渲染 (rendering) 工具,它强大的功能可以满足专业人士的需求。它可以创建和编辑 3D 几何图形,提供极具弹性的面向对象的插件增强功能及以节点作基础的可视化管线架构,所有参数和选项的调整,都会立即显现结果,而且可以无限次数地复原与取消复原。此外,它使用与 RenderMan 相符的渲染引擎 (render engine),可创作出电影质量的 3D 动画。
- 基于Qt的Linux发行版打包实战(qtlinux打包)
- 系统实现快速高效的基于Redis队列的抢单系统(基于redis队列抢单)
- 精心打造基于Redis集群的整合项目(redis集群整合项目)
- 基于Redis实现分布式链表存储(redis 链表 分布式)
- 提升性能基于Redis的多连接优化(redis连接增多)
- 与高通联动,中科创达和歌尔推出基于骁龙835的VR头显方案
- 基于KMP算法JavaScript的实现方法分析
- 基于递归实现的php树形菜单代码