PhysicalBasedRendering(一)物理篇
很多人对PBR的理解是存在偏差的,跳不出传统渲染模型的思维圈子,把它理解成一种模拟效果更为精确的算法公式,虽然在某种程度上是对的,但没有看到PBR的本质。
PBR是对光在真实世界中与环境交互的一种近似的物理模拟。当你看到它的某种实现时候,往往包含各种数学公式,这些公式背后都是对物理因子某种形式的模拟。所以对物理层面的一定了解,有助于我们后面去深入学习PBR的各种理论及理解对应的数学公式。
对图形渲染有些了解的都知道, 渲染方程(Render Equation)中最重要的两大部分就是镜面反射和漫反射,PBR也一样,那就先说说镜面反射和漫反射背后的物理原理。

(图1:光与物质在介质表面的交互.来源:百度百科)
学过初中物理肯定都能看的懂这张图,为什么会发生反射和折射就是我们接下来要讨论的。先提两个基本事实,光是一种电磁波,以及物质是由分子原子这些基本粒子构成的。
由于光与物质的反应大多是由于它的电场部分引起的,所以一般只考虑光的电场部分。构成物体的基本粒子,无论是分子或者原子,我们想象一下,正常状态下,原子内部的原子核带正电,有一个正电荷中心。而核外电子带负电,有一个负电荷中心,通常正负电荷中心是重合在原子中心,当光线照射到物体表面的时候,在光电场的作用下产生位移,从而使原子的正负电荷中心产生偏离(如图2),原子变成了电偶极子,这个过程也称为极化(关于电偶极子和极化的概念,请自行查询).随着光电场的强度周期性变化,原子的负电荷中心也会围绕着正电荷中心进行周期性的震荡,这种震荡会激发出辐射到周围各方向的电磁波。这是一种散射现象,在纯净均匀的物质中,每个电偶极子都相当于一个新的波源,它们向周围辐射出的电磁波,即球面波,由于相干性,在绝大部分方向上,这些电子波会因相互干涉而抵消掉。但是在两个方向上是特殊的一个是反射方向一个是折射方向,可以通过惠更斯原理来解释为什么会出现这种现象(如图3),感兴趣的朋友请自行了解。

(图2:原子在外电场作用下变为电偶极子.来源:网上PPT截图)

(图3:惠更斯原理解释光在介质交界处的折射和反射。来源:果壳网)
看到这里大家就要有一个认识,从光的波动性来理解折射和反射时,宏观上我们认为光照射到物体表面被反弹和射入,但微观上实际是光波被介质表面的粒子吸收能量并重新释放的过程。通过惠更斯原理只能说明光在物体表面的折射和反射方向关系,并没有解决反射和折射分量的多寡。这会受到很多因素的影响,其中有物质本身性质的影响,如磁导率,介电常数等,折射率就是由这些因子计算得来的一个量。但除了折射率以外光的入射角度也是影响的因素之一,这些因素综合起来也就形成了我们在PBR渲染中经常会提到的菲涅尔公式。这样一来就能知道光与介质在平面接触后反射和折射的方向和多寡了。其中在介质表面反射的那部分光也就是我们常说的高光,而对于折射进物体内部的光又会有怎么的命运呢?
和我们前面讨论物体表面的情况类似,折射入物体内部的光也会对物体内部的粒子相互作用形成散射,但此时物体内部构成是否匀等因素就会影响粒子们激发出的次波间的相干作用,也就是影响了散射的结果。我们PBR中经常提到的次表面散射大体上就是这么一回事(如图4),我们说光与物质粒子相互作用,激发起次波继续传播,但这个过程是伴随着能量损失的,一部分能量会转变成内能(热能),经过不断的散射,耗散的能量越多,所以一般越薄的地方,光越容易经过散射后从表面射出,人的皮肤就是一个很好的例子(如图5)。

(图4:入射光在物体内部的散射情况。来源:wiki)

(图5:皮肤的次表面散射。来源:网络)
是不是以为光的命运这里就结束了呢?有个大的方向我们一直没提,那就是光的吸收。要理解光的吸收,我们先要回顾一下共振:任一个系统(物体)都倾向于以一种自己认为舒服的某个频率进行振动,把这个频率就叫作这个系统的固有频率(如图6)。当系统受到来自外界的驱动进行振动时,若外界驱动频率与系统固有频率不同,则系统不能有效的吸收外界的能量,它会在很短的时间内把它释放出去。反之两者相近,则系统会最大程度的吸收外界驱动的能量,增大自己的振幅。此时就发生了共振。回到光上面,当粒子(电偶极子)受光电场作用进行受迫振动,若粒子的振动频率与入射光频率相近,则此时粒子会最大程度的吸收掉入射光的能量增大振幅,之后会慢慢转化为内能,反之则粒子受迫振动后吸收光的能量,但会在极短时间内以次波的形式释放出去,这种情况正对应前面提到的散射。

(图6:共振曲线。来源:网络)
在我们的日常生活中,自然光是多种频率光的混合体(赤橙黄绿青蓝紫,谁持彩练当空舞)。构成物体的不同粒子拥有不同的固有频率因而他们对不同频率光的吸收能力不同。除了固有频率,物体构成的空间结构不同,会影响光的散射和折射,导致看上去光好像是被吸收了一样。一个常见的例子就是金刚石和石墨,它们都是碳元素构成的单质,但是看上去完全是两种质感(如图7)。

(图7:金刚石和石墨的空间结构。来源:互联网)
综上所述,也就引出是物质对光的选择性吸收的概念,这也是物体颜色的本质。图7展示一些金属对不同波长的吸收能力,图8则给出了常见的电磁波谱,注意其中的可见光部分。综合一看不难发现金属一般对可见光的吸收能力都较弱,所以大都是银白色的,而有些如铜,金(图中Cu,Au)这样的金属对一部分可见光吸收作用,所以就呈现出一定的颜色。

(图7:一些金属对不同波长的吸收能力。来源:互联网)

(图8:电磁光谱。来源:互联网)
估计看到这里,大家应该对光与物体交互的物理本质有基本的了解了。我们再来考虑一个问题:为什么金属看上去永远是亮亮,而塑料或是布料这样的材质就不那么亮。
这其实与物体的导电能力是息息相关的,按照物体的导电能力,我们将其通常分成金属,电介质(上面的塑料和布料都属于这一类),半导体。我们都知道金属的导电能力是很强的,而电介质几乎都是绝缘的,半导体介于两者之间。之所以存在这样的差别是因为金属元素由于原子核半径较大及最外层电子较少等因素,导致其对核外电子的束缚能力很弱。这一金属中就充斥了大量的自由电子,这些自由电子在外部电场作用下就会进行定向移动产生电流,这就是为什么金属的导电性强,相反在电介质中一般粒子间是通过共价键结合形成稳定结构,对电子的束缚力很强,导电性就很差。而正是金属中的这些自由电子导致了它与电介质外观上的区别,为了保证金属内部的电场平衡,这些自由电子往往分布在金属表面,正是这些金属表面的大量自由电子造成了对可见光频段高反射率。和我们一开始说的偶极子一样,这些自由电子也会在光电场的作用下进行受迫振动,然后辐射次波,产生了折射和反射,不过它对可见光区段的反射强度要远大于折射部分,这也正是由于这些振动的电子是大量的自由电子。它与我们前面讲述的原子核外的电子在性质上不同,导致了反射和折射情况的巨大差异。更深层的原因,由于没有专业背景,就没有去深入探究,如果感兴趣,请自行了解吧。下面的图9和图10分别展示了金属和一些非金属物质的反射光谱。

(图9:一些金属的反射光谱。来源:Google)

(图10:一些金属以外其它物质的反射光谱。来源:Google)
图中可以看出,金属与非金属在可见光波段上的反射能力是有不小差别的。这正是由于上面我们提到的一些物质结构上的区别导致的,实际上影响反射率的因素还很多,尤其是对于电介质来说,是很复杂的。这里只是简化讨论。
上面就是本文的全部内容,不知道对大家是否有所启发,对于我个人来说,写作这篇文章的过程的意义,已经超过了最终完成这篇文章。整个过程中查阅学习了很多内容,不断刷新自己的理解,也深感国内在一些专业领域内网上的资料太少。
由于光的特殊性,对于光与物质交互由多种解释的角度,比如很多人从光子和电子跃迁的角度来理解反射折射,所以各个资料理解角度的不同,也容易造成认知上的混淆。本文总结了各种各样国内国外的资料,外加笔者自己的理解,仅仅是从光的波动性角度来尝试解释各种物理现象。并且由于笔者缺乏相关物理专业知识背景,难免在文章中存在错误和不严谨之处。如果大家有所发现的话,请务必留言指出,共同进步。希望大家带着问题去读,边读边思考,以免由于我的理解错误,影响你的理解。
我想篇这文章中一定存在着很多不严谨,甚至错误的地方,写作过程一波三折,其中经常要冥思苦想,刚刚认为想通的东西没过多久又被新了解到的知识推翻掉,有时候看到两种解释觉得都有道理,但又互相矛盾。感觉到了自然科学的精深,又多了几分敬畏。很多人也许会觉得写这样的文章是多次一举的,即使不了解背后的物理机制也并不影响用好PBR。我个人并不这样认为。正如我在开篇时候写的,不了解背后的物理机制,那么就很难理解PBR中那些常用的公式为何那么写,纯数学上的理解总感觉是有点隔靴搔痒的。另外对我个人而言,写作此文的整个过程远比最后码上的这些文字要有意义的多。整个学习过程是有收获的,虽然没有也没必要彻底的搞懂光是如何与物质交互的,但至少有了一个印象,日后再去看PBR一坨坨公式,总会有那么点感觉。
本文中的概念和知识,参考了很多国内外网络上的资料,在此列出一些重要的,方便大家自己去查阅。
1.Diffuse Reflection https://en.wikipedia.org/wiki/Diffuse_reflection
2.Relflection(Physics) https://en.wikipedia.org/wiki/Reflection_(physics)
3.Light Absorption,Rlection,and Transmission http://www.physicsclassroom.com/class/light/Lesson-2/Light-Absorption,-Reflection,-and-Transmission
4.知乎问题:金属泛光和其他平面的反光有什么本质区别?为什么偏振镜不能消除金属表面的反光? https://www.zhihu.com/question/24935575
尊重他人智慧成果,若要转载,请注明作者esfog,原文地址http://www.cnblogs.com/Esfog/p/PBR_PhysicalBasic.html
PhysicalBasedRendering(一)物理篇的更多相关文章
- TGL站长关于常见问题的回复
问题地址: http://www.thegrouplet.com/thread-112923-1-1.html 问题: 网站配有太多的模板是否影响网站加载速度 月光答复: wp不需要删除其他的模板,不 ...
- MongoDB【第二篇】MongoDB逻辑与物理存储结构
基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...
- Unity3d 基于物理渲染Physically-Based Rendering之最终篇
前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-B ...
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用操心.这太简单了~! 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www ...
- mysql 开发进阶篇系列 48 物理备份与恢复(xtrabackup 的增量备份与恢复,以及备份总结)
一.增量备份概述 xtrabackup 和innobackupex 二个工具都支持增量备份,这意味着能复制自上次备份以来更改的数据.可以在每个完整备份之间执行许多增量备份,因此,您可以设置一个备份 ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js
太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...
- Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測
事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖); // 0001 ); // 0001 ); // 0001 这样我们才干监听到它们的碰 ...
随机推荐
- JS实现日期选择
简单的JS实现日期选择,对于PHP来说就像是遍历一样,不过我个人觉得JS这个很有趣,随便记录一下 开始: <select name="gh_date"><opti ...
- AS 400 常用命令
转自:http://blog.chinaunix.net/uid-22375044-id-3049793.html 一.命令技巧 命令构成: CRT* (Creat) 创建 WRK* (Work Wi ...
- 开发Canvas 绘画应用(三):实现对照绘画
需求分析 在我的毕设中,提出了视图引导的概念,由两部分功能组成: (1)可以对照着图片进行绘画,即将图片以半透明的方式呈现在绘图板上,然后用户可以对照着进行绘画: (2)可以直接将简笔画图片直接拖拽到 ...
- s21day13 python笔记
s21day13 python笔记 一.装饰器 目的:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能 应用场景:想要为函数扩展功能时,可以选择用装饰器 装饰器基本格式: def ...
- python 内置函数 进制转换
4.内置函数 自定义函数 内置函数 len Open id() type() range() 输入输出 print() input() 强制转换 int() float() list() tuple( ...
- Python初学之使用方法修改字符串的大小写
对于字符串,可执行的最简单的操作之一是修改其中单词的大小写. titile()以首字母大写的方式显示每个单词,即将每个单词的首字母都改为大写: name.py name = "linda l ...
- UDP套接字编程 返回系统时间
计算机网络实验 简单UDP套接字编程 这是学校老师自己改进了一点的题目.我预习了好久才搞明白,同学来问的时候,一大堆简单问题实在是不想回答...所以,这时候我觉得博客是个好东西! 我的任务是做客户端和 ...
- 设计模式—模板方法(template method)
一.定义 百度百科给的定义:定义一个操作中的算法骨架(稳定),而将一些步骤延迟到子类中(变化).Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 如何做到 ...
- Alpha阶段个人心得
在一个学期的学习中,我从一个只会一个人打打小规模代码的初学者也变成了一个能参与到团队做项目的“入门码农”,而我们团队从一开始对大型项目的望而生畏无从下手变成细分任务各司其职,也了解并感受到github ...
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
Blade的UI都是预定义的接口, 然后由插件来负责实现, 目前只有MFC的插件. 最近加上了TableView的视图, 用于一些文件的查看和编辑, 比如前面在文件包的笔记中提到需写一个package ...