当我们渲染 3D 场景的图像时,无论是通过使用光线跟踪还是光栅化,无论是实时还是批量处理,被着色物体的三维视觉印象来源于场景形状与场景中对象之间的关系。在物理世界中,我们看到的大部分光都是反射光的,光反射是基于物理几何的,这产生了人类视觉系统对理解形状非常有效的各种线索。
在计算机图形学中,着色的目的是为视觉系统提供这些线索,尽管目的因程序而异:
- 在计算机辅助设计或科学可视化中,重点是清晰度:应以提供最清晰最准确的 3D 形状。
- 在视觉效果或广告中,目标是最大化渲染与真实对象外观的相似性。
- 在动画、虚拟环境或游戏中,目标目标介于写实和艺术之间:着色旨在实现艺术目的,包括描述形状和材料,但不一定打算完全模仿现实。
用于计算着色的方程称为着色模型,并为这些不同的应用程序开发了一系列不同的着色模型。一般来说,它们都从简单的模型开始,这些模型为光反射的物理提供了有用的近似。从这个起点,可以添加额外的特征来实现更接近物理的近似以进行逼真的渲染,或者可以修改或遗漏一些部分以使模型适用于更抽象的风格。
本章描述了一个由点光源照射的不透明表面的基本阴影模型。该模型可能是我们需要简单的应用程序,它形成了更高级的阴影计算的起点。
在现实世界中,表面上的光线来自各个方向。但是对于照明模型,最简单的情况是当光线从单个方向到达时。
这是理想化的,但它为远距离小尺寸光源提供了有用的模型(小如 LED 闪光灯、远如太阳)。 点状光源有两种:
- 点源足够小,可以看作是一个点,但靠近场景,可以以不同的方式照亮不同的表面;
- 方向源足够小(可以视作点,和它的距离相比)并且足够远,它可以以相同的方式照亮所有表面,以至于无需记录它的位置(例如闪光灯和太阳)。
点光源由其位置来描述,即 3D 空间中的一个点位置及其强度,它描述了它产生的光量。
点源可以是各向同性的,这意味着强度在所有方向上都是相同的。但许多系统提供了“点灯”,它只向某个方向发送光,这可以很方便地控制虚拟场景中的光,就像一个真正的点光对控制一个场景的光很有用。
对于各向同性点源,很容易推断光线落在某个距离表面上的亮度。假设我们有一个点光源,各向同性地发射 1 W 的辐射功率,我们将这个源放置在一个半径为 1 米的空心球的中心。光的所有功率都落在球体的内部表面上,并且它均匀分布在$4\pi m^2$的表面上。因此单位面积上的辐射强度是$1 / (4\pi)$W。这个值称为辐射照度(irradiance),用来描述有多少辐射照在表面上。
辐射强度(Radiant Intensity):单位立体角(solid angle)由点光源发出的功率(power)。 辐射照度(irradiance):在单位面积 dA 上的总辐射通量。 辐射(radiance):在单位面积 dA、单位方向 dw 上的辐射通量。
计算 Irradiance 的另一个重要考虑是表面法线和光线入射方向之间的夹角。
假设一个小表面被一个与表面大小相距较远的点光源照射,落在表面上的光大致平行。如果我们将表面倾斜到 60 度角,表面只能截获面对光源时的一半光。一般来说,当旋转$\theta$度时,它截获的光量(辐射能量)与 cos 成正比,由于面积保持不变,Irradiance 与相同的因数成正比。
这一规律,即表面上的辐照度与入射角的余弦成正比,被称为朗伯余弦定律(Lambert‘s cosine law)。点光源引起的辐照度的一般公式:
方向光源是明亮而遥远的点光源的极限例子。随着光源越来越远,比率
现在我们有能力计算辐照度,它描述了光线落在物体上的强度。然而,物体如何反射光线。这取决于对象的材料。在本章中,我们开发了一个带有光滑表面的彩色材质。
最简单的反射是一种表面,它平等地反映光到所有方向,而不管它来自哪里,因此观察者看到的反射光 Lr 只是辐照度的恒定倍数。
不管从什么方向观察的光照强度,都是表面辐射照度的倍数(BRDF 函数值为常数)。
理想的漫反射着色,通常称为 Lambertian 着色,它本身就提供了平坦的、模糊的外观。在物理上,它对材料内部反弹的光进行建模,并在所有方向上随机出现。例如,纸张、扁平油漆、污垢、树皮、石头和其他粗糙材料,他们没有清晰和足够光滑的顶部表面,以产生明显的闪亮反射。
许多材料有一定程度的光泽——例如,金属、塑料、光泽或半光泽油漆,或许多植物的叶子。当您观察这些材料时,您会看到当你移动视点时反射也会移动。 与 Lambertian 表面的视图无关颜色相比,您可以将它们的颜色描述为与视图相关的。反射的视相关部分一般发生在材料的顶部表面,称为镜面反射。
最简单的镜面反射发生在完美光滑的表面,如镜子或水面:光以类似镜子的方式反射,因此来自点源的光反射在一个确定的方向。这被称为理想的镜面反射,通常需要作为特殊情况来处理。 但是许多表面并不完全光滑,它们表现出更一般的反射,如光泽反射(Glossy Reflection)。 第 14 章讨论了更多更好的光泽反射模型,但 Phong (1975) 最初提出了一个简单且众所周知的模型,后来由 Blinn (1976) 更新。当今最常用的模型由前两者修改而来,称为 Blinn-Phong 模型。
由于镜面反射依赖于视图,它是视图向量 v、法向量 n 和光方向 l 的函数。最亮的镜面反射,仅当 v 和 l 相对于 n 对称是发生。当 v 和 l 不呈对称时,镜面反射逐渐减弱。
我们可以使用半矢量的概念来判断我们距离最亮镜面反射有多近。半矢量是观察方向 v 和照明方向 l 之间的矢量,当 l 和 v 处于镜像反射配置时,它正好垂直于表面。
如果半矢量靠近表面法线,镜面反射分量应该是亮的;如果它离得很远,镜面反射应该是暗的。我们通过计算 h 和 n 的点积来测量它们的近似度,然后将结果乘以 p>1 的幂,以使其更快地减小:
其他地方就是普通的漫反射,而在与入射光线对称的表面,反射强度极速上升为镜面反射。
这个表达式被称为双向反射分布函数(BRDF),它描述了反射率如何随 l 和 v 变化而变化。BRDF 对于朗伯而言是定值,然而对于带有镜面特性的表面则不是定值。 着色计算可以归结为计算辐照度和 BRDF,并将它们相乘。
在实现表面着色时,代码需要访问有关光源、表面和观察方向的信息。通过将辐照度的计算与反射光的计算分离开来,很容易编写出支持点和方向光的代码。辐照度仅取决于光源和表面几何形状,一旦知道,计算反射光仅取决于表面属性和观察几何形状。
基本着色计算可以在光线追踪和光栅化系统中以与完全相同的方式完成:
- 着色点 x 是表面上的一个 3D 点
- 表面法向 n
- 点光源的位置 p 或是定向光源的方向 l
- 点光源的强度 I 或是定向光源的规格化辐射照度 H
对于点光源,我们要计算距离表面的方向和长度:
- 入射光方向 l,表面点 x 指向灯光
- 视角 v,表面点 x 指向摄像机
- 描述表面性质的参数,反照率 R、镜面系数 k 和衰减系数 p
不要忘记 v、l 和 n 都必须是单位向量;无法规范化这些向量是阴影计算中最常见的错误。
点状源是非常局部化的光源模型,它在一个方向上产生大量光照。其他类型的光源并非如此局部化——例如天空,或从房间墙壁反射的光。
点状光源可以只从一个方向上计算它对表面着色的贡献。
虽然这样的扩展源可以在很大程度上建模真实世界,但对于基本的阴影,我们只需要一个非常简单的近似。因此我们假设环境光(不计算阴影的纯色 HDR)在所有方向和场景中的所有位置都完全相同。
我们进一步假设环境光只是漫反射的(因为光没有方向,因此没有计算镜面阴影的方法)。这使得环境阴影非常简单:常量!通常,这个常数是材质相关的环境反射系数 ka 和光源相关的环境强度 Ia 的乘积:
环境阴影的计算有些取巧——因为物体对大型扩展光源的反应有所不同:物体的角落和其他凹陷区域往往更暗(环境光遮蔽 AO)。但它是简单着色设置的重要组成部分,因为它可以防止阴影完全黑色,并允许轻松调整整体场景对比度。
许多系统将环境光视为一种光源。其他系统使环境强度成为场景的参数,因此环境没有明确的光源,这与假设总是只有一个环境光相同。