《Fundamentals of Computer Graphics》5th(计算机图形学基础/虎书),中文翻译。
第 14 章 Physics-Based Rendering 基于物理的渲染
虽然所有渲染都在某种程度上是“基于物理学的 (physics-based)”,但“基于物理学”这个术语实际上意味着我们将严格遵循物理模型,而不是“现象学”的启发式捕捉主观知觉特征,例如将高亮放在“正确”的位置的经验公式。本章概述了基于物理学渲染,并定义了该领域使用的单位和术语,并提供了一种能够非常缓慢地生成非常准确的图像的暴力“路径追踪”算法。我们不深入探讨存在的许多渲染算法的细节,但几乎所有这些算法都可以视为仅对暴力算法的改进。值得注意的是,效率的提高是我们在电影和游戏中拥有逼真图形的原因,这是无法忽视的。我们不涵盖这些细节,因为它们是一个移动的目标,并且在生态系统中有良好的覆盖范围,特别是 Pharr 等人的杰出 PBRT 书籍和代码库 (2016)。
为了使我们在直觉上更好理解,我们将以大量光子的集合来描述辐射度量,本节介绍了在这个背景下“光子”的含义。需要注意的是,在计算机图形学中,“光子”不一定意味着它在物理学中的确切含义,因此许多物理学家在阅读由计算机图形学人员撰写的关于“光子追踪”等主题的文章时会感到困惑。对我们而言,光子通常只是一个能量包,其行为遵循几何光学(其中光沿直线传播,没有波动性质)。
更确切地说,对于我们而言,光子是一束具有位置、传播方向和波长 的光束。有些奇怪的是,波长的国际单位是纳米()。这主要是由于历史原因,。另外一个单位 —— 埃(),有时也被使用,1 纳米等于 10 个埃。光子还具有速度 ,该速度仅取决于它通过的介质的折射率 n。有时也会使用频率 来表示光。这很方便,因为与 和 不同,当光子折射到具有新的折射率的介质中时, 不会改变。另一个不变量是光子所携带的能量 ,它由以下关系式给出:
其中 ,是普朗克常数。虽然这些量可以用任何单位系统来测量,但我们在可能的情况下将使用国际单位制。
对于光滑金属,光要么会像第 4.5.4 节中描述的那样高度反射,要么会被折射到表面并迅速被吸收(在非常薄的金属涂层作用下,有时可以看到光线穿透并发现金属实际上并不是不透明的)。反射的光量由菲涅耳方程 (Fresnel equations) 决定。这些方程很直观但又很繁琐。此外,它们的值随着光的偏振而变化,这通常在计算机图形学中被忽略。菲涅耳方程的主要视觉效应是反射率随着入射角增加而增加,特别是在接近 grazing 角时达到 100%。
几乎所有的图形程序都使用一个由 Schlick (1994) 开发的菲涅耳方程的简单近似。对于金属,我们通常指定法线入射时的反射率 。反射率应根据菲涅耳方程变化,并且 Schlick (1994) 给出了一个较好的近似公式:
其中 是光传播方向和表面法线之间的夹角。这个近似使我们可以根据数据或视觉判断仅设置金属的法线反射率。
介质是透明的材料,折射光线。如果它们不是金属,那么它们很可能就是介质。因此,皮肤、牛奶、头发、布料和几乎所有日常材料都是介质,虽然这并不明显,因为它们往往是不透明的,因为它们是不同折射率和吸收光的杂质的混合物。但是,光滑均匀的介质是透明的,例如玻璃、水和眼镜片。对于光滑的介质,只有三个重要属性:
光线如何在几何上弯曲以及反射/透射的比例取决于材料的折射率 。对于介质,相同的 Schlick 公式 14.2 用于反射率,与金属一样。然而,当其中一个材料是空气时,我们可以根据 来设置 。
如果方程两侧的折射率不是 1.0(如空气或真空),则使用以下公式:
通常, 不随波长变化,但对于重要的色散应用(不同波长从彼此分散产生彩虹)来说, 可以变化。经常有用的折射率包括水 (),玻璃 ( 到 ),以及金刚石 ()。
透过的光量是未反射的光量(能量守恒结果)。因此,我们不需要明确计算透射分数的公式。
介质也会过滤和折射光线;一些玻璃过滤掉比绿色更多的红色和蓝色光,因此玻璃呈现出绿色调。当一条光线从一个具有折射率 的介质到达一个具有折射率 的介质时,一些光被传输并弯曲。这在 的情况下在图 14.1 中显示。Snell's 定律告诉我们:
图 14.1 描述了角度 如何取决于物体和周围介质的折射率以及角度 。
的示例值: 空气:1.00; 水:1.33-1.34; 窗户玻璃:1.51; 光学玻璃:1.49-1.92; 钻石:2.42。
计算两个向量之间的正弦值通常不如计算它们的余弦值方便,在这里,对于单位向量的点积,计算余弦值就是简单的。使用三角恒等式 ,可以导出余弦的折射关系:
请注意,如果 和 颠倒,则图 14.1 右侧所示的 和 也颠倒。
要将 和 转换为三维向量,我们可以在表面法线 和光线方向 的平面中建立一个二维正交基底。
从图 14.2 中可以看出, 和 形成了折射平面的正交基底。根据定义,我们可以使用这个基底描述变换后的光线 的方向:
图 14.2。向量 和 形成了一个与传输向量 平行的二维正交基底。
由于我们可以用相同的基底描述 ,而且 是已知的,因此我们可以解出 :
这意味着我们可以用已知变量解出 :
请注意,无论 和 哪个较大,这个方程都适用。一个直接的问题是,“如果根号下的数字是负数该怎么办?”在这种情况下,没有折射光线,所有能量都反射。这被称为全反射,它是玻璃物体外观丰富的原因之一。
对于均匀杂质,如典型的有色玻璃,携带光线的强度将根据比尔定律 (Beer’s Law) 衰减。随着光线穿过介质,它的强度按照 衰减,其中 是距离。因此,。我们可以解出这个方程,并得到指数形式 。衰减的程度由 RGB 衰减常数 a 描述,它是单位距离后的衰减量。将边界条件代入,我们知道 ,且 。前者意味着 。后者意味着 ,因此 。因此,最终公式为
其中 I(s) 是距界面 s 处的光束强度。因为指数函数的对数存在,我们也可以写成
在实践中,我们根据眼观数据反推出 ,因为这些数据很少容易找到。比尔定律的效应可以在图 14.3 中看到,其中玻璃呈现出绿色调。
图 14.3。玻璃的颜色受到全反射和比尔定律的影响。透射和反射的光量由菲涅耳方程确定。请注意,当光线垂直入射时,传输的光线更多。
这个效应同样适用于透射光。这些想法在图 14.4 中以示意图的形式展示。请注意,光线如图 14.5 所示,反复反射和折射。通常,只有一个或两个反射图像很容易看到。
图 14.4。玻璃反射和传输的光量随角度变化。
图 14.5。光线通过玻璃反复反射和折射,显示能量的分数。
只需使用光滑的介电材料,我们就可以渲染出一个令人惊讶的材料数组。许多看起来“哑光”和不透明的表面都可以模拟为多个介电材料。考虑一个完美的冰块。它看起来像一块玻璃,只是折射度较小(冰的折射率低于玻璃)。现在在这个冰块里面放置许多小的球形气泡,随着添加更多的空气泡,它会变得越来越不透明。
这种散射元素的基本思想可能是气体或其他物质,负责我们看到的大部分不透明度。另一种使冰块看起来不透明的方法是将表面粗糙化。这可以通过在计算机图形模型上细致地镶嵌表面,然后对每个三角形顶点的位置进行小的随机扰动来实现。这会产生类似于霜玻璃(本质上就是那种表面)的效果,其中不透明度随着扰动越来越大而出现。
通过插入具有颜色并激活比尔定律的粒子,还可以实现更复杂的效果。这是一种相当简单且令人惊讶地准确的模拟涂料的方法。
通过显式建模微观结构,可以模拟出丰富的材料复杂性。例如,人皮肤可以被建模为一个粗糙的表面和略微不同折射率的层,色素颗粒(遵循比尔定律),以及血液(遵循比尔定律)。
假设我们将场景建模为具有微观结构和一个发光物体的介电材料,我们该如何最简单地渲染它并生成图像?在本节中,我们将讨论如何仅仅蛮力模拟光子,并从传感器发送相对(反向)光子。这实际上可以在图形学中产生一些最好的图片,代码量非常少,但速度极慢。
为了生成图像,我们必须有某种图像捕获设备的概念。一个简单的设备可能是一个简单的传感器阵列(如 CCD),和一个带小孔的盒子,以便其起到针孔相机的作用。阵列中的每个传感器基本上都是一个光子计数器(某些波长会引起比其他波长更强的响应)。在用光子轰击之后,传感器阵列将具有可写出为图像的值。接收到较少光子的传感器将被写成黑色,而接收到大量光子的传感器将被写成白色,并带有各种灰度值。
要生成彩色图像,我们可以在传感器前面以某种模式放置红、绿和蓝色滤镜。最简单的滤镜是带通滤波器:
如果将所有传感器初始化为零,则完全响应意味着在光子撞击传感器时增加存储在传感器中的数字。
要追踪光子,选择光源上的一个随机点,并选择一个随机方向和 400 到 700nm 之间的随机波长(其他波长不会影响传感器阵列,因此不需要计算)。现在以与第 4 章中描述的方式追踪射线。当它触及表面时,计算其反射率并决定是反射还是折射。这个决定是通过评估该波长和入射角的 Schlick 近似值来做出的,我们称之为 。现在生成一个均匀随机数 。
if (ξ < R) generate a reflection photon (ray) and trace it else generate a refraction photon (ray) and trace it
如果表面是金属,则只有在折射情况下光子被吸收,并从光源开始一个新的。
如果光子进入介质且比尔定律系数不为 1(意味着它像绿玻璃一样吸收光),则光子可能会以概率被吸收(因此消失)。我们使用与在反射和折射之间决定相同的基本技术来做出决策:
if (ξ < probability of absorption) absorb and start new photon else allow this photon to exit medium at the next hit
以上过程就足以创建出优秀的图像!只是速度会很慢。
上面的针孔相机将产生非常清晰的图像,就像真正的针孔相机一样。但是需要长时间曝光,因为很少有光子会在被吸收之前通过针孔。
我们可以通过向相机添加镜头来解决这个问题,方法是使针孔变大,并将镜头放置在孔内。我们可以建模一个真实的复合玻璃透镜组,或者插入一个理想的薄透镜。
我们可以制作的最简单的玻璃透镜是两个球体的交集(“双凸球形透镜”)。它具有良好的成像性能(尽管不如大多数真实相机中的复合透镜那样好),并且非常容易进行射线相交代码编写。
薄透镜是一种理想化的透镜,无限薄(所以在射线追踪程序中将是一个圆盘),仅用半径(透镜的物理尺寸)和焦距 指定。可以通过强制执行以下三个属性来实现薄透镜:
“沿着光轴”,我们指沿着垂直于镜头的轴向(因此“瞄准”沿着射线)的距离。
需要注意的是,具有真实或理想的镜头将自动给出在真实照片中得到的模糊效果,通常称为虚焦 (defocus blur) 或景深 (depth of field)。
为了考虑运动模糊 (motion blur),在照片中移动的物体将被模糊,或者移动的相机使没有与相机以相同速度移动的物体变得模糊(例如,想象一下从火车上拍摄的照片,火车内部清晰,风景却模糊)。如果我们支持以下两个功能,则可以自动产生这种效果:
一个简单的移动对象示例是其中心沿时间基线的一条线移动的球体:
上面的光子追踪器将正常工作并且效果良好,但是速度非常慢,因为即使您插入了镜头,大多数光子也永远不会碰到镜头(如果将太阳模拟为光源,则幸运的是,任何光子都有可能到达相机)。
在图形学中通常做的事情是倒转时间,并从相机发送射线,并在它们击中光源时记录它们。在我们制作的光子追踪器中,这是非常容易的。相反,我们从每个像素发送光子(技术上称为伴随光子),并查看它们在哪里与光源相交。这些光子的波长由于将彩色滤光片视为光发射曲线而确定,当我们击中一个光源时,使用发出的光的权重记录光子(在像素传感器阵列上)。
在实际应用中,上一节的暴力渲染器是不可行的。因此,我们不是建模微观几何,而是建模整体行为。这是使用衡量光的实际问题的工具来完成的,通常称为辐射度学。在辐射度学中出现的术语可能一开始看起来很奇怪,并且术语和符号可能难以保持清晰。本节最重要的数量是辐射率,但是大多数图形学人员如果学会了什么是辐射率,将其映射到直观的亮度/颜色/强度概念中,在实践中,这在 99%的时间内有效。但有时需要实际定义,我们在此提供。
虽然我们可以在许多系统中定义辐射单位,但我们使用 SI(国际单位制)单位。熟悉的 SI 单位包括米 (m) 和克 (g) 的公制单位。光基本上是一种传播形式的能量,因此定义 SI 能量单位很有用,该单位是焦耳 (J)。
如果我们有大量光子,可以通过对每个光子的能量 求和来计算它们的总能量 。一个合理的问题是“能量如何分布在波长上?”回答这个问题的一种简单方法是将光子分成多个 bin,基本上就是制作直方图。然后我们有与区间相关联的能量。例如,我们可以计算在 和 之间的所有能量,并发现它为 ,这可能表示为 。如果将波长区间分为两个 的区间,则 且 。这告诉我们,在区间 的短波长半部分中存在略微更多的能量。如果我们将其分成 的 bin,则可能会发现,例如,。该系统的好处是它非常直观。坏处是间隔大小的选择决定了数量。
更常用的系统是将能量除以区间大小。因此,不是 ,我们会有
这种方法很好,因为间隔大小对数字的整体大小的影响要小得多。一个即时的想法是将间隔大小 驱动到零。这可能有些尴尬,因为对于足够小的 , 将是零或巨大的,具体取决于该区间中是否有单个光子或没有光子。有两种思考方式来解决这个困境。第一种是假设Δλ很小,但不至于量子本性开始发挥作用。第二种是假设光是一个连续体而不是单个光子,因此适合真正的导数 。两种思考方式都是适当的,并且会导致相同的计算机制。实际上,似乎大多数测量光的人更喜欢小但有限的间隔,因为这是他们可以在实验室中测量的。大多数进行理论或计算的人则更喜欢无穷小的间隔,因为这使得微积分的机器可用。
数量 称为光谱能量,与能量、长度或质量等极值量相反,它是一种强度量。 强度量可以被认为是密度函数,它告诉无穷小点的广度密度。例如,在特定波长处的能量 可能为零,但是光谱能量(能量密度) 是一个有意义的量。可能更熟悉的例子是一个国家的人口可能为 2500 万,但是在该国的某个点的人口是没有意义的。但是,每平方米人数测量的人口密度具有意义,前提是它在足够大的区域内进行测量。与光子一样,如果我们假装可以将人口视为连续体,其中人口密度即使在面积较小时也不会变得粒状,那么人口密度就最好的工作。
我们将遵循图形学的惯例,其中几乎总是使用光谱能量,很少使用能量。这导致如果使用“正确”的符号表示法,则会出现λ下标的大量使用。相反,我们将省略下标并使用 表示光谱能量。这可能会在图形学论文被非图形学领域的人阅读时导致一些混淆,因此请注意这个标准问题。您对光谱能量的直觉可能会通过想象具有测量设备和测量光能量 的传感器得到帮助。如果在传感器前放置一个彩色滤镜,该滤镜仅允许 范围内的光通过,则λ处的光谱能量为 。
对于光源估计能量产生的速率很有用。这种速率称为功率(power),它以瓦(W)为单位,这是焦耳每秒的另一个名称。在稳态下最容易理解,但由于功率是一种强度量(时间密度),即使能量产生随时间变化,也很好定义。功率的单位可能更为人所熟悉,例如 100 瓦的白炽灯泡。这样的灯泡每秒大约会消耗 100 焦耳的能量。由于热损失等原因,产生的光的功率实际上会小于 100 瓦,但我们仍然可以使用此示例来帮助更好地了解光子。例如,我们可以感觉到 100 瓦灯光在一秒钟内产生了多少光子。假设平均产生的光子具有 500nm 波长光子的能量。此类光子的频率为
该光子的能量为 。这意味着即使灯泡不是非常高效,每秒也会产生惊人的 1020 个光子。这就解释了为什么使用快门速度快且直接模拟光子的相机模拟器不是生成图像的有效选择。
与能量一样,我们真正感兴趣的是以 测量的光谱功率。再次强调,虽然光谱功率的正式符号标准是 ,但出于方便和与大多数图形学文献的一致性,我们将使用没有下标的 。需要注意的是,光源的光谱功率通常比功率小。例如,如果一束光在 400-800nm 波长范围内均匀发射 100 瓦功率,则光谱功率将为 。这是调试目的手动设置光源的光谱功率时要记住的事情之一。
上一节中用于光谱能量的测量装置可以通过在时间 处以持续时间 打开的快门进行读数来进行修改。然后,光谱功率将为 。
如果你问“有多少光线照射到这个点?”,辐照度这一量自然而然地产生了。当然,答案是“没有”,我们必须再次使用密度函数。如果该点在表面上,则使用面积定义我们的密度函数是很自然的。我们修改上一节的设备,使其具有小于要测量的光场的有限ΔA 面积传感器。光谱辐照度 H 只是单位面积Δ\phi ∕ΔA 的功率。完全扩展,它是
因此,辐照度的完整单位为 。请注意,辐亮度的 SI 单位包括面积的反平方米和波长的反纳米。这种看似不一致(同时使用纳米米和米)是由于面积和可见光波长的自然单位。
当光离开表面时,例如当它被反射时,与辐照度相同的量称为辐射出射率 。具有入射和出射光的不同术语很有用,因为同一点可能具有不同的辐照度和辐射出射率。
虽然辐照度告诉我们有多少光线到达一个点,但它对光线来自的方向没有多少作用。要测量类似于我们眼睛看到的东西,我们需要能够将“有多少光”与特定方向相关联。我们可以想象一个简单的设备来测量这样的量(图 14.6)。我们使用一个小的辐照度计,并添加一个锥形的“障板”,该障板限制了击中计数器的光线在固定立体角Δσ内的范围内。探测器的响应如下:
图 14.6。通过向辐照度检测器添加一个仅显示小立体角 的障板,我们测量辐亮度。
这是光在空间中行进时的谱辐亮度。同样,在我们的讨论中,我们将省略“谱”,并假设它是隐含的。
在图形程序中通常计算的是辐亮度。辐亮度的一个很好的性质是它沿空间中的一条线不变。为了看清楚这个问题,看一下两个辐亮度探测器都朝向一个表面的情况,如图 14.7 所示。假设探测器所望向的路径彼此相距很近,以至于正在被测量的两个区域中的表面发出/反射“相同”的光。由于采样表面的面积与平方距离成比例,并且因为到达探测器的光与平方距离成反比,两个探测器的读数应该相同。
图 14.7。辐亮度探测器接收到的信号不取决于被测量表面的距离。此图假设探测器指向表面上以相同方式发出光的区域。
测量击中表面的辐亮度是有用的。我们可以考虑将辐亮度检测器的锥形障板放置在表面上的一个点上,并测量由锥体内方向发出的辐照度 (如图 14.8 所示)。请注意,表面“探测器”未与锥体对齐。因此,我们需要将余弦修正项添加到辐亮度的定义中:
图 14.8。锥形遮罩掩盖的表面辐照度小于探测器测量的辐亮度,因为存在余弦因子。
与辐照度和辐射出射率一样,区分点上入射的辐亮度和从该点发射的辐亮度也很有用。图形学文献中有时用于这些概念的术语是表面辐亮度 (表示表面(离开)的辐亮度)和场辐亮度 (表示入射到表面的辐亮度)。它们都需要余弦项,因为它们都对应于图 14.8 的配置:
用辐亮度表示的其他辐射度量
如果我们有一个场辐亮度为 的表面,那么我们可以从中推导出所有其他辐射度量。这是辐亮度被认为是“基本”辐射度量的原因之一。例如,辐照度可以表示为
这个公式有几个符号约定,在计算机图形学中很常见,但对于不熟悉它们的读者来说可能难以理解(见图 14.9)。首先, 是入射方向,可以看作是单位向量、方向或相对于表面法线的球坐标 对。该方向具有关联的微分固体角 。场辐亮度对每个方向都可能不同,因此我们将其写成函数 。
图 14.9。方向 有一个关联的微分固体角 。
例如,我们可以计算在所有方向上场辐亮度恒定为 的表面上的辐照度 。为了进行积分,我们使用经典的球坐标系,并回忆微分固体角为
因此辐照度为
这个关系式首次出现了可能令人惊讶的常数π。这些π因子在辐射度学中经常出现,是由于我们选择如何测量固体角的方式而产生的;即单位球的面积是π的倍数,而不是 1 的倍数。
同样地,我们可以通过对表面积分辐照度来找到撞击表面的功率:
其中 是表面上的一个点, 是与该点相关的微分面积。请注意,我们没有针对入射和出射功率使用特殊的术语或符号,这种区别似乎并不足以促进这种区别的出现。
第 14.5 节的光子追踪假设所有表面在光线相互作用的水平上都很光滑,并且我们假设存在非常复杂的几何形状和非常精细的几何细节。实际上,为了使一个区域的块特性像精细的几何一样(但不存储它),需要对其进行平均处理。本节最重要的概念是针对粗糙表面(例如,刷铁),而不是使用实际几何来表示所有微小的划痕,而是统计性地表征这些划痕,并使光随机地在多个方向上反射,就好像表面中有看不见的小细节一样。这个函数被称为双向反射分布函数 (bidirectional reflectance distribution function (BRDF))。第二个重要的概念是一种类似的思想,即如何在体积中散射光线(例如,冰块中的气泡或云中的水滴)。与其用实际的粒子/气泡/水滴来表示体积中的所有小颗粒,我们只需制定一个统计模型,以确定在任何给定的 3D 位置上光线散射的可能性,被吸收的可能性以及散射光的方向分布。该方向分布只是一个 PDF,称为体积的相函数。我们不再讨论相函数或体积传输;有关这些主题的更多信息,请参阅章节注释。
因为我们对表面外观感兴趣,所以我们想表征表面如何反射光线。在直觉层面上,对于从方向 进入的任何入射光,都有一些在与出射方向 相近的小立体角内散射的分数。我们可以用许多方法来形式化这样的概念,毫不奇怪的是,标准的方法是受到简单测量设备的启发。在图 14.10 中展示了这样一种设备,其中一个小型光源从表面上的一个点看来位于方向 处,并在方向 中放置探测器。对于每个方向对(),我们使用探测器进行测量。
图 14.10。用于方向反射的简单测量设备。光源和探测器的位置移动到每个可能的方向对上。请注意, 和 都指向远离表面的方向,以实现相互性。
现在我们只需要决定如何测量光源的强度,并使我们的反射函数与此强度无关。例如,如果我们用更亮的光源替换光源,我们不希望认为表面反射光线有所不同。我们可以在被照亮的点处放置辐亮度计来测量光线。但是,为了获得不依赖于探测器Δσ的准确读数,我们需要光线占据一个比 更大的立体角。不幸的是,我们漫游的辐亮度探测器沿着方向 采取的测量也将计入来自新探测器锥形范围外的点的光线。因此,这似乎并不是一个实际可行的解决方案。
或者,我们可以在表面上的被测点上放置一个辐照度计。这将进行不太依赖于光源几何细节的读数。这提示我们将反射率表征为一个比值:
其中这个分数 将随着入射和出射方向 和 变化, 是光源位置 的辐照度, 是沿着方向 测量的表面辐亮度。如果我们为所有方向对进行这样的测量,最终得到一个 4D 函数 。该函数称为双向反射分布函数(BRDF)。BRDF 是我们需要了解的所有内容,以表征表面如何反射光线的方向性特性。
定向半球反射率 (Directional Hemispherical Reflectance)
给定 BRDF,很容易问:“有多少入射光被反射?”但是答案并不那么简单;反射的分数取决于入射光的方向分布。因此,我们通常只为固定的入射方向 设置反射分数。这个分数称为定向半球反射率。这个分数 由以下公式定义:
请注意,由于能量守恒的原因,这个量在 0 和 1 之间。如果我们让入射功率 照射到一个小面积 上,则辐照度为 。此外,入射功率的比值就是辐射出射功率与辐照度的比值:
由 BRDF 的定义,这种功率产生的特定方向辐亮度为:
根据辐亮度的定义,我们还可以得到:
其中 E 是以 方向上小块的辐射出射功率。使用这两个辐亮度的定义,我们得到:
重新排列一下,我们得到
这只是在特定的 附近反射的 的小贡献。为了找到总的 ,我们对所有出射角 进行求和。用积分形式表示,得到
理想漫反射 BRDF
一个理想的漫反射表面被称为 Lambertian 表面。由于热力学原因,这样的表面在自然界中是不可能存在的,但在数学上,它们确实满足能量守恒。Lambertian BRDF 对于所有角度都具有相同的ρ,即一个常数。这意味着该表面对于所有观察角度具有相同的辐亮度,并且这个辐亮度与辐照度成比例。
如果我们计算一个 Lambertian 表面 的 ,我们得到
因此,对于完全反射的 Lambertian 表面(),我们有ρ=1/π,对于具有 的 Lambertian 表面,我们有
这是另一个例子,其中使用立体角的显式单位确定归一化常数,并引入 的因素。
利用 BRDF 的定义,我们可以描述表面辐亮度与来自所有不同方向的入射辐亮度之间的关系。由于在计算机图形学中,我们可以使用理想化的数学模型,而这些模型可能在实验室中难以实现,因此我们还可以仅基于辐亮度来表示 BRDF。如果我们从立体角 处取一小部分光线,其辐亮度为 Li,并“测量”由于这小部分光线反射到方向 的辐亮度,我们可以计算出一个 BRDF(图 14.11)。由于这一小部分光线的辐照度是 ,因此 BRDF 为
图 14.11。运输方程在其方向性形式下的几何结构。
这种形式在某些情况下非常有用。重新排列项,我们可以写出由来自方向 的光产生的辐亮度部分:
如果有许多方向 的光照射,我们可以对它们进行求和。用表面和场辐亮度符号表示,积分形式为:
在计算机图形学中,这通常被称为渲染方程(Kajiya, 1986),最早是由(Immel, Cohen 和 Greenberg,1986)写成的形式。
有时,将传输方程仅基于表面辐亮度来表示会更有用。请注意,在封闭环境中,场辐亮度 来自具有表面辐亮度 的一些表面(图 14.12)。点 所张立体角由下式给出:
图 14.12。进入一个点的光线来自另一个点。
其中 是我们与 相关联的区域。用 代替 ,可以得到以下传输方程:
请注意,我们使用非归一化向量 表示从 到 的方向。还请注意,我们将 写成位置和方向的函数。
这个新的传输方程唯一的问题是积分的定义域很棘手。如果我们引入一个可见性函数,就可以在积分中折衷复杂性:
其中
许多真实材料在正常观看距离下都有可见的结构。例如,大多数地毯都有明显可见的绒毛,这些绒毛会影响外观。对于我们而言,这种结构不是材料属性的一部分,而是几何模型的一部分。在正常观看距离下细节不可见但确实影响宏观材料外观的结构,是材料属性的一部分。例如,纸张中的纤维在放大观察下具有复杂的外观,但在手臂伸展距离内观察时,这些纤维会被模糊成均匀的外观。这种将微观结构折叠到 BRDF 中的区别在某种程度上是任意的,并取决于人们如何定义“正常”观看距离和视觉敏锐度,但在实践中已经证明这种区别非常有用。
文献和工业界中有许多 BRDF 模型。许多领域都使用 BRDF 模型,包括遥感、热传递、材料科学,当然还有计算机图形学。不幸的是,这些领域之间没有标准术语集,甚至在计算机图形学领域内也没有。然而,大多数人都同意以下术语,如图 14.13 所示。
图 14.13。McGuire 等人(2020)提倡的材料术语分类法
在工业界中,通常将材料分类到这些类别中,并为每个术语使用不同的 BRDF 模型。然后,这些模型术语与常数或由 Fresnel(Schlick)变化确定的简单权重相结合。关键问题是要使用哪些术语。实践越来越倾向于采用为计算机生成动画开发的 Burley/Disney 模型的变体(Burley, 2012),但现在该模型也被广泛应用于游戏和产品设计中。它包括图 14.13 中各个主要类别的术语,以及另一个波形:光泽。这不包括在图 14.13 的分类法中,因为它还没有被广泛应用于图形学中,并且在图形学以外也不作为技术术语使用。光泽项用于考虑接近边缘的效果,例如可以在皮肤和织物上看到的边缘照明,有关更多信息,请参见 Estevez、Imageworks 和 Kulla(n.d.)。反射式术语在某些情况下非常重要,但在图形学中并不常用。
实践中 BRDF 模型中使用最普遍的两个术语是漫反射和光泽波。漫反射通常使用常数,但还有其他的变体,在接近边缘时会变暗,这时光泽波接管。目前最主要的光泽波形式是 GGX 微表面波(Walter 等人,2007)。微表面波与我们对粗糙表面的蛮力表示非常密切相关,但只是找到微观平面的表面法线的统计分布。请注意,这些微表面方法是对具有微观表面特征的实际表面的近似。Heitz(2014)深入讨论了这个主题,重点关注实现。
一旦我们将照明表达为积分,就可以使用 Monte Carlo 积分(见第 2.12 节)来解决它。回想一下,对于 的积分,蒙特卡罗积分只是从许多随机样本中得到的平均值:
其中 是定义在区域 上的概率密度函数。如果将其应用于公式 14.4,则对于一个随机样本方向 ,我们得到
请注意,为了获得噪声较小的图像,我们需要对许多嘈杂的样本进行平均。那么我们该怎么做呢?首先,我们需要一种方法来生成一些 PDF 的随机方向。请记住, 可以是任何有效的 PDF,因此我们可以做出均匀分布:。这是该值,因为积分在“表面上方所有传入方向的立体角”上,并且立体角是投影到单位球面上的面积,“表面上方”的方向是半个球面,其面积为 。
在代码中,这看起来像是针对入射光线方向 a 的:
但是 是来自方向 的颜色吗?实际上,我们可以递归地应用蒙特卡罗积分(这不是显然的,但可以使用随机变量的属性证明预期值即使在求和项不相互独立的情况下也能加和)。如果编写返回来自方向 的点 的颜色的函数 ,并添加发出的光以便有东西可见,那么我们可以编写一个递归函数:
请注意,如果环境是封闭的,该函数将永远不会终止,因此应为封闭环境添加一些终止救援。background 函数可以返回常数,也可以查找环境映射或其他随方向变化的函数。最后,除了背景之外,没有必要有灯就可以得到好的图片。
您可能会注意到,这与本章早期开发的伴随光子追踪器非常相似。导出方法不同,采取明确的辐射积分方法,但它确实得出了类似的结论。
在实践中,当灯光很小时,该算法可能会非常嘈杂,因为 emitted()
值可能很大,并且对于小灯来说很少见。相反,人们经常通过单独计算发光物体的贡献来分解直接照明。例如,
在这里,directLightAt(p)
计算直接照明,即由离开灯光并在没有任何干涉表面的情况下到达 的光子引起的颜色。该代码有一个怪癖,即直接看到的灯光将变黑(代码中没有显式发射项),因此实际上真正的代码需要以某种方式处理这一点。
直接照明通常也使用 Monte Carlo 计算,但通常使用面积度量来仅从光源上选择样本,从而评估公式 14.5。
请注意,上述方法只要材料不是完全光滑的,即图 14.13 中的脉冲,就可以很好地工作。严格来说,对于这些材料,BRDF 是具有无穷大值的δ函数,恰好在一个方向上工作,因此在形式上可以工作,但是不能使用计算机浮点运算。在那里,我们需要为这些材料添加“if”,就像在第 4 章中处理射线那样。
什么是“强度”?
术语“强度”在各种情况下都有用途,其使用随着时代和学科而变化。实际上,它已不再作为特定辐射测量数量具有意义,但在直观讨论中仍然有用。大多数使用它的论文都将其用于取代辐射亮度。
什么是“辐射度”?
术语“辐射度”在某些领域中取代了辐射通量密度。有时它也用于描述世界空间光传输算法。
即使使用复杂的 BRDF,我的图像看起来太平滑了。我做错了什么?
BRDF 仅捕获不能通过眼睛分辨的子像素细节。大多数真实表面也具有一些小变化,例如皮肤的皱纹,可以看到。如果您想要真正的逼真感,则需要某种纹理或位移图。
如何将 BRDF 与纹理映射集成?
纹理映射可用于控制表面上的任何参数。因此,BRDF 使用的任何颜色或控制参数都应该是可编程的。
除了我的材料类之外,我的代码非常漂亮。我错了什么吗?
您可能什么也没做错。材料类往往是每个人程序中最丑陋的东西。如果您找到了处理它的好方法,请告诉我们!我们自己的代码使用着色器架构(Hanrahan&Lawson,1990),使材料包括大部分渲染算法。
人们使用什么模型来进行相位函数?
几乎唯一使用的模型是 Henyey-Greenstein 函数,它具有一个参数,可控制其“伸展”程度。
BRDF 和相位函数看起来很相似,为什么要以如此不同的方式处理它们?
实际上,BRDF 可以被视为相位函数和散射消光系数,但由于历史和实际测量原因,它们通常被单独处理。在代码中给它们提供统一的表示方式可以很好地工作,但需要向习惯于表面 BRDF 的人解释清楚。
本章中未描述的常见辐射测量数量是辐射强度(I),它是从无穷小点源发出的每立体角的光谱功率。通常应在图形程序中避免使用点源,因为它们会引起实现问题。有关辐射测量的更严格处理可以在模拟光传输的解析方法(Arvo,1995a)中找到。本章中的辐射和光度术语来自照明工程学会的标准,该标准越来越被所有科学和工程领域所使用(美国国家标准协会,1986)。有关辐射和外观标准的更广泛讨论可在数字图像合成原理(Glassner,1995)中找到。
文献中描述了许多 BRDF 模型,这里只描述了其中一些。其他模型包括(Cook&Torrance,1982; He 等,1992; Oren&Nayar,1994; Schlick,1994; Lafortune,Foo,Torrance&Greenberg,1997; Stam,1999; Ashikhmin,Premože,&Shirley,2000; Ershov,lchin,&Myszws,2001; Matusik,Pfister,Brand&McMillan,2003; Lawrence,Ru\sin ewicz,&Ramamoorthi,2004; Stark,Arvo,&Smits,2005)。BRDF 模型的期望特性在使着色器更加物理上可信(Lewis,1994)中进行了讨论。现代电影和游戏工作室的活动非常关注材料模型的进展,Unity、Solid Angle、Disney 和 Sony 是有趣的例子。对于光泽项,远远占主导地位的模型是 GGX 模型,在 PBRT 书籍和由 Eric Heitz 共同撰写的许多论文中得到广泛介绍,特别是(Heitz&d’Eon,2014)。
本文作者:青波
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!