精确模拟 CG 中的光(辐射度、辐射照度、辐射通量、反射、BRDF、光模拟、直射光、区域光、双重反射、传感器、集成算法)
Note
这是对MIT Foundation of 3D Computer Graphics第21章的翻译,本章讲解了光的精确模拟算法的基础知识,包含辐射率,辐射照度,辐射通量,反射,BRDF,光模拟,直接光,区域光,两次反射,传感器,积分算法等算法。本书内容仍在不断的学习中,因此本文内容会不断的改进。若有任何建议,请不吝赐教ninetymiles@icloud.com。
注:文章中相关内容归原作者所有,翻译内容仅供学习参考。
另:Github项目CGLearning中拥有相关翻译的完整资料、内容整理、课程项目实现。
已经完成的章节
- 第一章
- 第二章
- 第三章
- 第四章
- 第五章
- 第六章
- 第七章
- 第八章
- 第九章
- 第十章
- 第十一章
- 第十二章
- 第十三章
- 第十四章
- 第十五章
- 第十六章
- 第十七章
- 第十八章
- 第十九章
- 第二十章
- 第二十一章
- 第二十二章
- 第二十三章
- 附录B-仿射函数基础
光(技术角度)
本章中,我们会更详细地描述光和反射是如何被正确测量和表达的。这些概念对于非正式的(要求不高的)计算机图形可能不是必须的,但是为了进行高质量的渲染,它们可能就变得重要。这种高质量渲染经常借助独立软件来完成并且不会使用和OpenGL相同的渲染管线。我们讲到一些这样的材料,因为它可能是高级计算机图形中最有发展前景的部分。本章将会比本书的其余章节在更高层级(难度)讲解材料。对于这种材料更详细的处理,参考Jim Arvo的博士论文[3]和Eric Veach的博士论文[71]。
要理解高质量光模拟需要两个步骤。首先,你需要懂得测量光和反射所需要的正确单位。这种理解直接导致在场景中建模光如何表现的方程式。其次,针对这些方程式,你需要计算近似的解法。这些算法重度使用在第20章中所描述过的光线追踪基础设施。本章中我们聚焦在推导正确方程式所需的更基础性的概念上,并且仅仅提及随后的算法问题。对于这些问题要参考更多资料,感兴趣的读者应该阅读[71,30]。
我们关于光的基本思考模型(mental model)为相关于“几何光学”的。我们把光当作飞过空中的一个光子场(field of light)。在*空间中,每个光子不受干扰地以直线飞行,并且每个都以相同的速度移动。当光子撞击一个表面,它们从那个点以多个方向散射。我们也假设这个场处于均衡状态。
21.1 多种光单位(Units)
如果我们要仔细模拟真实的图像,我们首先需要懂得用于测量光的单位。我们将借助一些简单的光子测量来完成这种讨论。这会引导我们到一个被称作辐射率(radiance)的非常有用的单位。
21.1.1 辐射通量(Radiant Flux)
我们把光当作一束以多个方向飞过空中的光子。想象出一个位于空中的“传感器”,此处是一个平整的想象参考表面并且为一个由方向构成的楔形。在这个传感器中,我们计算在楔形中从任何方向进入并且通过表面的光子的数量。在我们的场景中可能存在和重合的一个真实的物理表面,或者想象的传感器可能正位于*空间中。参考图示。
Figure 21.1: 传感器统计了以楔形中的入射方向通过表面的光子。这会给出我们,辐射通量的测量。
这种传感器随后计数了每秒所接收的光子的数量。每个光子携带了以焦耳为单位测量的能量。通过用时间(以秒为单位测量)除能量,我们获得一种称作辐射通量的测量方法,以瓦特(watts)为单位测量。我们使用符号表达这样一种测量。
接下来,我们假设(或通过实验验证)当我们连续改变传感器的几何特征(平移,旋转,或改变尺寸),会连续变化。给出这种假设,我们现在已经就位,可以去定义许多有用的辐射测量方式。
21.1.2 辐射照度(Irradiance)
首先,我们要定义出光的测量方式,比方说在一个非常小的拥有法线平面传感器,这种方式不依赖传感器的实际尺寸。我们可以简单把测量的辐射通量除以传感器的面积(以平方米为单位测量)。执行这个步骤,我们获得一个测量(数据)
我们可以针对越来越小的围绕单点测量。根据关于合理的连续性假设,这个比率(几乎处处)汇合到一个值,我们称为一个(入射)辐射照度测量,并且记作。参考图示。为了指定在这种测量序列中越来越小的传感器方位,我们需要持续保留参数。如果我们已经考虑了在空间中具有一个不同法线的不同表面上相同的点,我们会获得一个不同的数量。(并且,由于楔形是有限大小的,不存在轻松的方式将关联到。随后,当我们定义了称为辐射率的数量,我们会缩小为一个矢量。在那种情形中,简单的cosine因子将可以把测量和不同的法线关联起来。)
Figure 21.2: 我们可以把辐射通量除以。在极限情形中,这就变为逐点的入射辐射率测量。
经常,在文献中,针对的第一个参数会从标记方式中去除,并且从公式和上下文中以某种方式被推断。例如,在某些上下文中,可能为点上整个上半球体是明确的。相似地,法线参数经常从标记中去除而且从上下文推断出来。
假设有限大小的传感器表面被分成许多更小的表面,。那么我们可以在整个传感器之上计算辐射通量为下面的求和公式
同样地,根据关于的合理连续性假设,我们可以计算逐点的辐射照度为
此处为表面上的积分,而为这个位置上的面积测量。
21.1.3 辐射率(Radiance)
我们接着要定义一种不依赖楔形尺寸的测量,并且我们要约除掉,的纯角度测量。来自于原点的楔形中的纯角度只是被定义为单位球体上被楔形所覆盖的区域。这些单位被称作球面度,此处所有方向的楔形覆盖了的球面度。
现在我们通过将辐射照度除以球面度来定义一种新的辐射测量
我们可以围绕一个指向点的矢量借助越来越小的楔形来测量这种数据。再次,根据围绕合理连续性假设,这会汇聚到一种我们称为的测量,此处现在为单一方向矢量,并且不是楔形。参考图示。
Figure 21.3: 我们可以通过除以一个被测量的辐射照度来获得测量。这会聚合于,去掉上标,给出我们用于光线的辐射率测量。
我们现在通过转化对的测量为,从而去掉对的依赖。换句话说,测量会有的情形是让平面正交于入射光束。要实现这种测量,我们必须考虑到它们被平铺于上的传感器表面面积之间的比率。这可以被计算为
此处为和之间的角度。我们现在去掉法线参数,将这个简单地记作而不是。我们把这个称作入射辐射率(incoming radiance)测量。参考图示。汇总为
还有一种方式(going the other way),给出一个空间的和角度的变化,我们可以计算大传感器之上的辐射通量为
此处为球面度的微分测量。辐射率测量允许我们测量一个点的光和方向,而不用保持跟踪测量设备的尺寸和方向。并且,虽然我们的辐射率标记包含一个3D点作为它的一个变量,事实上(参考下面寻求一个论据),辐射率在*空间沿着一条射线保持为常量。也就是
针对一个表面上的点,从点以方向对向外发出的辐射率进行测量也是有用的(我们反转对于参数的顺序以将入射辐射率和外出辐射率区分)。我们可以把这个定义为
此处为离开一个有限大小的表面并且沿着楔形中的矢量离开的光子的辐射通量(再一次,要注意参数的顺序)。
在*空间中,很明显
辐射率是计算光模拟所需的最有用的数量。确实,我们能返回第14章和20章并且使用这些单位解释那些方法。例如,当我们在OpenGL碎片着色器中计算某个3D点的色彩时,我们把这个解读为计算发出的辐射率,此处是“查看矢量(view vector)”。这种发出的辐射率值也是处于图像平面上对应的样本地址处射入的辐射率值,并且被用于给像素上色。同样地,在光线跟踪中,当我们沿着射线追踪一条光线,我们可以把这个解读为计算入射的辐射率值,。
沿着光线的辐射率的恒定性(选学)(Constancy of Radiance Along a Ray (optional))
在*空间中,假设我们沿着矢量滑动传感器以获得移位的传感器,此处(参考图示)。在这种情形中,我们测量的通量将不会认可。但是如果我们计算辐射率,在极限情况下,我们会得到一致性。实际上
在第三行,针对非常小的楔形,我们使用极限情况下的事实,就是我们的传感器和移位的传感器会测量相同集合的光子,从而
作为这种公式的结果,我们说辐射率沿着光线为常量。
Figure 21.4: 我们可以沿着*方向移动一个传感器。针对小楔形的极限情形,它们将主要测量相同光子。从这种角度我们可以总结沿着光线的辐射率是常量。
根本上,我们可以把这种常量认为是形成于两种事实的组合。第一个,我们的物理假设暗示,在*空间,被测量的通量,,只依赖于被测量的直接光线的集合,而不是不测量的地方。其次,针对任何光线集合,比方说被称作,如果我们通过方向参数化光线,借助这些方向它们命中某些平面,然后光线测量:事实上不会依赖平面的选择。借助这种术语,辐射率只是光线测量上辐射通量的强度,并且的选择是不相关的。
21.2 反射(Reflection)
当光线从-楔子中围绕矢量的入射方向-进入并且照射到物理表面上的点,然后那个光的一些可以从表面被反射。我们做出简化的近似或假设,所有的反射都是逐点的,也就是说,照射到一个点的光只从那个点反射出去。让我们测量沿着被反射的光,围绕发出方向矢量的某个楔形。反射的详细状况通过材料的物理属性所控制。我们希望使用某种描述入射-出射光比率的函数表示这种反射的行为。对于这种比率我们应该使用什么种类的单位?当我们使用越来越小的入射和出射楔形时,我们的指导原则是我们想要一种聚合的比率。这简化了我们的第二准则(其以自身或关于自身的方式是值得拥有的):我们想要一种实际上不依赖楔形(针对足够小的楔形)尺寸的比率。
在这个部分中,我们会推导描述反射的主要方式,称为BRDF。针对特殊的材料,比如纯粹镜面和折射媒介,我们会使用稍微不同的表达。
21.2.1 BRDF(双向反射分布函数)
我们可以以实验方式证实大多数材料(排除纯镜面或镜头,参考下面)具有下列漫射行为。针对任何固定的入射光模式,当我们旋转这个楔形时,沿着任何出射楔形方向被测量的出射光连续改变。因此如果我们加倍一个小的出射测量的楔形的尺寸,我们会看到大约两倍的出射辐射通量。所以,要以一种不依赖的尺寸的方式设置比率的分子,我们应该使用辐射率的单位。让我们称这种出射测量:。我们在上放置一个上标在这里用以澄清我们正在讨论(refer to)反射光子的测量。
同样地,(但可能令人吃惊地)我们可以验证,对于大多数材料(再次提醒镜面和镜头被排除),如果所有光线来自于一个小的楔形,并且我们加倍这个入射方向楔形的宽度,沿着固定出射方向楔形的辐射通量的数量,也大约会加倍。因而,要获得一个不依赖尺寸的比率,在这种情形中我们需要分母去加倍。我们通过以辐射照度单位测量完成这种测量。
把这个汇总,我们看到我们应该测量反射为
此处我们使用上标用来指已经被某种光源发射但还没被反弹的光子。再一次,通过让围绕固定的的入射楔形越来越小,这个数量被汇聚到一种被表示为的测量。这种函数,,被称为双向反射分布函数,或称BRDF。它是一种在入射和出射方向都变化的函数。参考图示。
Figure 21.5: BRDF测量入射辐射率相对于出射辐射率的比率。
最简单的BRDF为常量BRDF 。这表达了漫射材料的行为。在这种情形中,一个点的出射辐射率完全不依赖。(微妙之处:这不意味着入射光子没有在所有出射方向被均等散射。事实上,在一个漫射表面上更多的光子在表面法线的方向上被散射,并且被散射的光子数量通过一个cosine因子在掠过的角度减弱为0。相对比地,出射辐射率不依赖出射角度,因为辐射率的定义包含它自身的cosine因子,所以它取消了这种“减弱”因子。直观地讲,当从掠过角度观察一个漫射表面,每表面面积单位上更少的光子朝向你而来,但是通过传感器你也看到更多的表面面积。)
更复杂的BRDF从更多方法被推导。
- 我们完全能处理(应付)某种让我们的材料在图像中显得更好看的函数。这本质上是我们在14小节中所做的。
- 我们借助多种物理假设和统计分析推导BRDF函数。这涉及光和材料的更深入理解。
- 我们可以构建实际测量真实材料BRDF的设备。这可以被存储为一个大的表格形式,或者借助某种函数形式被近似。参考图示。
Figure 21.6: 通过测量设备捕获的一系列BRDF。来自于参考书吗[47],©️ACM。
假设我们想计算拥有法线的表面上一个点的出射,由于光从点上的半球体射入。并且假设被分解为有限大小的楔形集合。那么我们借助求和公式计算反射光
同样地,借助积分和,我们使用积分计算反射光:
这被称为反射方程式,并且对于我们的大部分模型,这是用于光模拟的基础。参考图示。
Figure 21.7: 要计算出射反射辐射率,,反射方程式计算了所有朝向而来的入射光线的积分。
21.2.2 镜面和折射(Mirrors and Refraction)
纯粹镜面反射和折射不易于使用BRDF表达被建模。在镜面的表达中,,沿着光线反射的辐射率,仅仅依靠,沿着一条光线的入射辐射率。这里为方程14.1的反射操作符。
加倍包含的入射楔形的尺寸在上没效果。因而,对于镜面材料,我们表达反射行为为
此处为某种材料系数。我们替换反射方程式为
在这种情形中积分不再需要。因为这个原因,镜面反射易于以算法方式计算,并且易于在光线追踪程序中完成。
当光使用不同的折射指数在媒介之间通过,例如当光进入或者离开玻璃,借助恰当的几何规则,光线发生弯曲。就如镜面反射,在材料接口上,沿着每个出射光线的辐射率被入射光线的辐射率所影响。再一次,在这里使用“辐射率的比率”单位是最容易的,就像在方程(21.4)中。
21.3 光模拟(Light Simulation)
反射方程式可以被用于嵌入风格来描述光如何围绕一个环境多次反射。这样的描述通常导致需要被计算的有限积分。实际上,这种计算在积分域上通过某种具体的采样动作来完成。
在这个部分,我们会开始于来自14章的着色模型的简单光模拟,然后逐步扩大为更复杂的模型。
我们使用不带参数的符号表达由某种光子几何而导致的场景中辐射率测量的完整分布。这样一种
包含场景中任何地方的所有入射和出射测量。我们使用表达未反射(散射的)光子。并且表达已经确切反弹次的光子的辐射率。
21.3.1 直接点光(Direct Point Lights)
在我们的基本OpenGL渲染模型中,我们的光不是来自于区域光,而是来自于点光。这样的点光确实符合我们的连续假设并且不是那么易于使用我们的单位表达。实际上,对于点光我们只要替换反射方程式为
由于点光源和为从点照射到光的“光矢量”的缘故,此处为进入照射到的未反射的辐射照度。我们可以随意以我们想要的方式计算。例如,在真实世界中,对于一个非常小的球体光源,在一个点上的辐射照度成比例于,此处为光和表面之间的距离。这是因为小光源的纯粹角度减弱为。(另一方面,这种距离减弱项倾向于使得图像过于暗,所有经常不被使用)。也要注意到,在小节14的语言中,我们让。
21.3.2 直接区域光(Direct Area Lights)
假设我们的光源拥有有限大小的面积,然后我们真正需要反射方程的积分。在这种情形中,方程(21.2)中在H上的被积分函数(integrand)对于"看得到"光的入射方向仅为非零值。
如果我们使用某中有限数目的入射方向近似积分,我们可以使用光线追踪方式计算这些值。当随机被用于选择这些方向,这种方式被称为分布式光线追踪(distribution ray tracing)[13]。因为光线相交是一种昂贵操作,这些积分要精确计算可能非常昂贵。
当光源部分被其它几何体遮挡,这种积分会产生拥有某种软边界的阴影。这会发生是因为在一个光-接收表面上临近的点上可能看见不同数量的光源面积。参考图示。
Figure 21.8: 区域光之上的积分引起了软阴影(soft shadows)。来自于数目[69],©️ACM。
21.3.3 两次反弹(Two Bounces)
我们可以计算,第二次被反弹光子的光分布,通过使用反射方程式,但是用替换“输入”。
在这种表达式中,是沿着射线首先被击中的点。在相交点,是法线,是上半球体,而是输入方向,其和构成一个角度。参考图示。
Figure 21.9: 要计算,我们需要两种嵌入的积分。针对每个朝向的方向,那儿我们找到被展示的射线所命中的点。我们随后需要求得到在之上半球体的积分。
一旦被计算,我们可以加总到一起,并且在图像平面上把这个作为点的被观察色彩。
就如在上面方程中第二行中所暗示的,一种计算的方式是借助分布光线追踪通过迭代评估这些嵌入的积分。也就是说,一个外部循环积分求得点
上一篇: 什么是数字信号
下一篇: 辐射测量 几个基本概念