灯光和阴影

2020-07-02 00:38:58

很难描述光有多重要。归根结底,这是我们唯一能看到的东西。但是,光的存在同样重要,它的存在也同样重要。要谈论光,我们必须从黑暗开始,所以让我们直接进入它。

光是电磁辐射的可见部分,但在本文中,我不会讨论任何潜在的细节,如波粒二元性。取而代之的是,我将尝试解释光是如何创造出日常生活中看到的如此多美丽的效果的。在下面的演示中,您可以使用滑块来控制矩形光源的位置和大小。您还可以在场景周围拖动以从不同角度查看:

在本文结束时,本演示中的灯光效果应该会变得更加清晰,但是在我们到达那里之前,我们必须后退几步,从一个简单得多的设置开始。

让我们从介绍单个球面光源开始。虽然这个光球不是很令人兴奋,但您至少可以使用下面的滑块来控制它的亮度:

这个滑块实际调节的是光源的能量--每秒从光源发出的能量。这种能量以光子的形式出现,我们可以粗略地用从光源发出的光线来表示。功率越高,单位时间内从源发射的光线就越多:

不幸的是,这次演示相当有限。即使是一个简单的灯泡每秒发射的光子数量也是绝对巨大的,而且它们行进的方向没有固定的集合。话虽如此,射线类比将有助于解释相当多的现象,所以尽管它有缺陷,它仍将作为一个有价值的工具服务于我们。

光源的功率是使用瓦特W的单位来测量的。让我们看看我们是如何根据光源的功率来感知其亮度的:

请注意,感知亮度的相对变化很大程度上取决于滑块的位置。从5兆瓦到10兆瓦的变化比从85兆瓦到90兆瓦的变化要明显得多。人类视觉系统对入射光的功率有非线性反应,因此功率的固定增加不会有感知亮度的固定增加。

此外,灯光本身的亮度很快就会饱和到纯白。我们已经达到了网络技术可以轻松展现的极限。有一些方法可以缓解这个问题,但在本文中,我想展示未经修改的亮度级别,因为这使得相对比较成为可能。

尽管有白色的饱和度,一旦我们在明亮的灯光旁边放置一个哑光表面,我们就可以很容易地观察到增加功率的效果。您可以在演示中拖动以从不同的角度查看场景:

虽然曲面本身不发射任何光,但它会反射从光源发出的光。反射光的一部分直接进入我们的眼睛,使我们能够看到物体。当然,表面的另一边是一片漆黑--因为它被正面挡住了,所以光线无法到达它。

提到这些概念可能看起来微不足道,但反射光和阻挡光最终将定义我将在本文中讨论的几乎所有内容。

如果仔细观察前面的模拟,您可能已经注意到曲面照明不均匀。让我们通过移动灯光来研究着色中的变化。在下面的演示中,您可以控制其高度、角度和距离:

即使在这个简单的示例中,我们也可以观察到灯光定位的角度和它到被照亮对象的距离都会影响无光表面的外观。我们可以通过观测源发出的射线来试图了解到底发生了什么。为便于查看,仅以全长绘制命中曲面的光线:

更改灯光的位置会更改击中曲面的光线数量,从而影响曲面的外观。请注意,曲面的不同部分得到不同数量的光线,所以让我们隔离一小块区域并仔细观察它。

首先,我们来分析一下高度角的影响。在下面的模拟中,红点终止了过去命中垂直情况下的小面片的光线,但在倾斜后不再这样做:

一旦光源偏离垂直方向,一些过去照射到补丁上的光线就不再这样做了。我们可以从侧面更好地看到这种情况。蓝色箭头显示曲面法线。与二维情况类似,三维中的法线方向局部垂直于曲面。黄色箭头指向光源:

随着角度的增加,原始光流的一小部分会照射到表面。利用光源P的功率,单位面积E的接收功率(称为辐照度)击中具有面积A的表面的小块,与入射角α在入射光方向和补片的法向量之间的余弦成正比:

对于光源较小但距离较远的平坦无光表面,此余弦因子的着色结果并不是特别令人兴奋,因为曲面的每个点看起来几乎都一样。但是,当曲面的每个元素都有不同的入射角度时(如球体),无光曲面的着色效果可能会非常漂亮。在下面的示例中,黄色箭头显示朝向远处光源的方向:

覆盖余弦因子后,我们现在可以分析到光源的距离是如何影响光线分布的。同样,红点显示了过去击中面片的光线的交叉点,但由于光线距离的增加,它们不再这样做:

光线距离越远,击中曲面面片的光子就越少。对于那样微小的光源,我们可以用几何推理来量化这种关系。在下面的演示中,您可以看到从一个小光源向各个方向发出的光线。该源被球体包围-您可以使用滑块控制其半径:

请注意,当球体半径增大时,黄色交点的密度会减小。当光线数量不变时,曲面的总面积会增加,局部灯光强度会被更多地稀释。球体的面积与其半径r的平方成正比:

因此,在功率固定的情况下,单位面积的接收功率E与距离r的平方的倒数成正比:

这条法则被称为平方反比定律,它只适用于物理世界中不存在的无限小光源。因此,这种简化的假设不能让我们解释即使是一个简单的矩形光源所获得的各种阴影:

为了理解这里正在发生的事情,我们需要稍微改变一下节奏,讨论一下视角和视野。

如果你曾经看过一辆正在驶离的汽车,你可能已经注意到它在驶离时看起来更小了。在下面的演示中,我们可以通过控制汽车的位置来重现这种情况。上半部分显示该场景的自上而下视图,下半部分显示站在红点上时的视觉效果:

围绕红点的灰色圆圈象征着整个周围的视野。当汽车离开时,它在该视野中的角度(如黄色圆弧所示)变小,因此汽车看起来更小。

汽车模拟使用度数单位显示角度,但观察到黄色圆弧的长度也随着角度的减小而变小。在数学中,用圆弧的长度与圆弧所在圆的半径之比来测量角度是非常常见的:

角度的度量用弧度表示。您可以在下面的演示中看到度和弧度之间的关系:

当角度测量为1弧度时,黄色圆弧的长度等于蓝色半径的长度。圆的周长等于2π乘以半径,因此半个完整的转圈只测量π弧度。

与度数类似,以弧度为单位的角度测量与圆的半径完全无关。圆的周长与半径的比值总是等于2π,而圆弧的长度与半径的比值只是2π的一小部分。

作为本节中的最后一个考虑事项,让我们调查当对象在视野中已经很小并且远离观察者时,对向角度以及弧长会发生什么情况:

请注意,黄色弧线非常平坦,在此场景中,当对象移动两倍的距离时,它所覆盖的角度几乎是原来的两倍。当我们把圆弧看作一条直线段时,这是根据相似三角形的基本比例得出的。由于曲率变得更加微不足道,随着弧线变短,这种近似变得更加精确。

在汽车示例中,我很方便地只关注了感知到的汽车宽度,但您可能已经注意到,远处的车辆似乎也变短了。人类的视觉不仅仅局限于水平方向,所以让我们试着通过将示例扩展到第三维来模拟我们的视野。这一次,为了省去3D建模练习,我将使用一个简单的矩形:

请注意,随着矩形的移开,球体上的投影区域会变小。这就完成了为什么物体在距离较远时看起来更小的解释-它们只是占据了我们视野中较小的一部分。

在二维中,我们将角度定义为圆的圆弧长度与该圆半径的比值。在三维中,我们类似地将立体角度定义为球体上对向面片的面积与该球体半径的平方之比:

补丁的形状可以完全任意,重要的是它的面积。在下面的演示中,您可以看到一些立体角,它们是用立体角测量的。我高亮显示了到达面片的圆锥体,以使事情更可见,但最终只有黄色区域定义了实心角度:

由于球体的面积是半径的4π倍,所以最大立体角是4π。请注意,弧度和立体度都是无量纲的,我们只是给它们起个方便的名字,以识别我们正在谈论的角度。

最后,让我们看看当对象移开时,小实心角度会发生什么情况:

当矩形的投影足够小时,半球上的曲面片可以用平面片来近似。由于投影的宽度和高度都与距离成反比,因此补丁的面积以距离的平方缩小,从某种意义上说,从观察者的角度重新创建了平方反比定律。

让我们尝试将视野和立体角度的概念从上一个场景映射到曲面。又来了:

表面的每个点都暴露在它的环境中,但是一个点只能通过以它为中心的半球看到它的周围。球体的另一半只是被表面本身挡住了--任何光线都不能从它下面到达。如果我们现在把灯光放到场景中,试着把它投射到半球上,我们就可以观察到投射区域发生了什么。我使地板背面看起来透明,以便让您从内部看到半球:

面积越小,光源的立体角度就越小,因此到达曲面的光量就越少。然而,我们仍然没有考虑余弦因素-靠近地平线的立体角度应该影响较小。

事实证明,我们可以通过使用一个简单的技巧来解决这个问题,即将对角的轮廓从半球投影到底面上:

此过程会自动考虑余弦因子-请注意,当光源接近地平线时,曲面上投影的黄色区域会变小。这种投影实体角度的方法解释了无光表面上的点在由均匀光源照明时显示的亮度。

到目前为止,我向您展示的内容可能看起来是合理的,但是您可能会对一些不一致之处感到疑惑。正如我们已经看到的,无光表面在远离灯光时变暗,并且随着灯光的高度角偏离垂直方向也变得越来越暗。

然而,光源本身似乎没有经历同样的效果-即使我们从倾斜的角度看它,或者用滑块远离它,它仍然保持一致的亮度:

无光表面似乎从各个方向收集周围的光线。人眼和数码相机的工作原理截然不同。通过光学系统,视网膜中的每个感受器或相机中的每个像素只从一个非常小的立体角度收集光线。在下面的演示中,左边的一个微小的蓝色感受器只暴露在黄色锥体“看到”的光中:

当光源移开时,到达感受器的能量会按距离的平方的倒数递减。但是,与此同时,立体角度可见的光面增加了一个平方的距离-您可以在右下角观察到圆锥体底座的圆。这两种效果相互抵消,感觉到的亮度保持不变。

像这样的接收器测量辐射度,即单位面积和单位立体角的能量。感受器的大小和它接收光的立体角度都会影响所收集的能量。

当人看到光时,我们经常使用术语亮度,它就是人类视觉系统的波长敏感度函数加权的辐射度。亮度定义物体在我们眼里看起来有多亮,它用尼特表示--你可能听说过这个术语,指的是显示器的亮度。

光源的视角无关性只适用于所谓的朗伯发射器,然而,许多典型的光源,如磨砂灯泡和太阳,都是这些理想化发生器的近似值。

Lambertian发射器的每个点都按以下球形图案发光,箭头的长度对应于每秒在箭头方向上发射的光子的相对数量:

矢量的长度与远离法线的角度的余弦成正比,最终形成一个完美的球体。要了解此分布如何影响总亮度,让我们看看观察者如何从侧视图中感知灯光的表面:

黄色形状代表接收器接收光的立体角度,只有直接向其方向发射的光子才会到达接收器。

随着视角的倾斜,每个箭头的长度都会变小,因此曲面的每个点对观察者贡献的光子都会减少。然而,在同一时间,感受器可以看到更大的表面。可以看到更多的箭,从而抵消了短箭的影响。

由于箭头的长度与角度的余弦成正比,可见面积与完全相同角度的余弦成反比,因此总的感知亮度保持不变。

眼睛和无光表面积累的光线不同,这就解释了为什么移动的光源会对它们产生不同的影响。灯光聚集的半球模型似乎适用于无光曲面,但它肯定不能解释平面镜的行为:

让我们试着可视化一下用蓝色箭头表示的入射光线最终如何被镜子以红色箭头的方向反射:

请注意,如果出射光线直接指向您,则只能在入射光线指向的位置看到光源的反射。镜子的外观取决于观察者的位置--镜面上的同一点可能会有非常不同的外观。

让我们考虑一面稍微粗糙一点的镜子,一面可能没有擦得那么好的镜子。它可能会以类似于下面的图案反射光线:

请注意该材质中反射光的边缘是如何稍微模糊的。箭头的长度代表亮度,粗糙的表面会将一定数量的光散射到与完美反射不完全对齐的方向。

之前的可视化非常以光为中心,因为我们调查了入射光是如何散射到出射光中的,但是,我们也可以尝试反转情况,并检查来自不同方向的入射光如何影响出射光的单个固定方向:

当您将灯光定位在大部分入射光线的中心稍偏,并直接观察出射方向时,您会注意到该位置的反射确实不那么明亮,因为并非所有影响观察方向的入射方向都与光源相交。

最后,让我们考虑一个Lambertian曲面,它描述了一种完美的无光漫反射材质:

兰伯特曲面的每个点都会在其周围发出均匀的辐射。在固定距离上,只有余弦因子影响点的亮度。实际上,兰伯特曲面的每个点都充当兰伯特发射器--从我们看它的每个方向看,它看起来都是完全一样的。

如果我们分析入射辐射如何影响单个方向上的出射辐射,我们最终会得到如下分布:

这种分布与出射方向完全无关,它实际上与我们一直使用的半球表面投影立体角度方法完全等效-来自更接近地平线的方向的光线对最终着色的影响较小。

任意曲面反射光线的方式可能要复杂得多,并且可以用某个函数进行数学描述。虽然也有更抽象的方法来对材料进行分类,例如按其粗糙度、金属度或光泽进行分类,但通常的方法是-出射辐射始终可以计算为来自所有方向的入射辐射的加权和。

我在本文中主要关注的是Lambertian曲面,因为它们是许多真实材质(如哑光墙漆和纸)的不错模型。对于每个观察方向,它们都会受到来自任何观察方向的光线的影响,从而产生许多美丽的阴影效果。

在下面的演示中,我们面对的是一个有熟悉的矩形灯光的场景,但这次我在地板表面的中间放了一面黑色的墙。这面墙有一个模糊的轮廓,所以更容易看得见。使用滑块可以控制信号源的高度、角度和大小。光的总功率是恒定的,所以当光源变小时,其单位面积的功率就会增加-这就保持了场景的一致亮度。

我们可以在这里体验到很多有趣的现象,例如,请注意,随着光源变小,它产生的阴影也会变得更加清晰。利用我们的投影半球,我们可以很容易地理解为什么会发生这种情况:

对于一个小光源,即使是表面位置的微小变化也会对光线的可见性产生很大的影响-它很快就会完全可见或完全被遮挡。另一方面,大光源的过渡要平滑得多--地板表面上完全暴露和完全不可见的光源之间的距离要大得多。

当震源很小时,不要被投影区域的微观大小所误导。回想一下,我将源的总功率保持不变,因此对于s,单位面积发射的功率要高得多。

..