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

时间: 2024-08-29 22:30:51

PhysicalBasedRendering(一)物理篇的相关文章

诗经 全文

诗经 全文 (带注释和译文) http://www.edu009.com/Article/HTML/Article_60756.html <诗经> 春秋·孔丘 <诗经>是我国第一部诗歌总集,先秦时代称为“诗”或“诗三百”,孔子加以了整理.汉武帝采纳董仲舒“罢黜百家,独尊儒术”的建议,尊“诗”为经典,定名为<诗经>. <诗经>现存诗歌 305 篇,包括西周初年到春秋中叶共 500 余年的民歌和朝庙乐章,分为风.雅.颂三章. “风”包括周南.召南.邶.鄘.卫.王

Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測

事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖(小若:32个喷! ),怎么都到第七篇了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/920 文章来源:笨木头与游戏开发 碰撞监听 首先,确保我们创建物理对象的时候,给对象设置了碰撞条件(假设你是一步步按着教程来写的代码,那就是设置好了): body->setCategoryBitmask(1);  

Unity3d 基于物理渲染Physically-Based Rendering之最终篇

前情提要: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-Based Rendering之实现 最后我们用fragment shader 实现,加上diffuse漫反射,代码和之前的surface差不多,只是多了reflect方向的计算,reflect方向的计算方法为用CG函数库中函数reflect, float3 reflect(float3 i, flo

Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用担心,这太简单了~! 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/804 文章来源:笨木头与游戏开发 3.0新亮点,史上最简单的物理引擎 在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了. 那么,我要开始创建游戏的关卡场景了,大家跟紧了. 我们给关卡场景命名为Toll

HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js

太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章,"愤怒的小鸟篇" 此篇,并不是书中的篇符,而是通过希望通过结合实际的canvas 绘图库实现box2d物理引擎在各绘图库上应用,绘图库网上有很多现成的 如:createjs, pixi.js 等,Egret或者其它游戏引擎有自己的物理引擎扩展库,所以就不说了. 现在通过之前的学习,基本掌握了刚体等基础

VC++获取屏幕大小第二篇 物理大小GetDeviceCaps 上

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 上一篇<VC++获取屏幕大小第一篇像素大小GetSystemMetrics>中介绍了使用GetSystemMetrics函数来获取屏幕的像素大小,本篇将介绍使用GetDeviceCaps函数来获取屏幕的物理大小.下面来看看GetDeviceCaps函数的用法: 函数功能:用于得到被定义的系统数据或者系统配置信息 函数原型:获取一些

己亥清爽恢复系列之数据文件3篇:非核心数据文件物理损坏或丢失(无备份恢复)

己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复,来自于博客园AskScuti. 实验说明:物理删除非关键系统数据文件,模拟介质损坏或丢失,且在无备份的情况下,如何进行手工完全还原恢复操作.注:控制文件.在线日志和归档日志都完整的情况下. 基于版本:Oracle 11gR2 11.2.0.4 AskScuti 概念说明:请严格区分什么叫还原(Restore),什么叫恢复(Recover). 还原(Restore

iOS开发——高级篇——UIDynamic 物理引擎

一.UIDynamic 1.简介什么是UIDynamicUIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象重力.弹性碰撞等现象 物理引擎的价值广泛用于游戏开发,经典成功案例是“愤怒的小鸟”让开发人员可以在远离物理学公式的情况下,实现炫酷的物理仿真效果提高了游戏开发效率,产生更多优秀好玩的物理仿真游戏 知名的2D物理引擎Box2dChipmunk 2.使用步骤要想使用UIDynamic来实现物理仿真效果,大致的步骤如下

Linux ALSA 音频系统:物理链路篇

1. Overview 硬件平台及软件版本: Kernel - 3.4.5 SoC - Samsung exynos CODEC - WM8994 Machine - goni_wm8994 Userspace - tinyalsa Linux ALSA 音频系统架构大致如下: +--------+ +--------+ +--------+ |tinyplay| |tinycap | |tinymix | +--------+ +--------+ +--------+ | ^ ^ V | V