NSDT工具推荐Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模

在本课程中,我们将首先了解什么是阴影以及影响物体外观的不同参数有哪些,例如光强度或方向、物体表面相对于光源的方向、物体的颜色等。 一旦吸收了这些基本概念,我们将能够研究一些非常基本的技术来为有光源和无光源的物体着色。 然后我们将继续研究更复杂的着色技术,例如反射和折射。 最后,我们将学习如何使用程序纹理使物体表面在视觉上更具吸引力。

本课只是对着色的基本介绍。 在本节中,我们只是介绍渲染,我们不会用太多着色科学背后涉及的理论来吓到你。 我们将保持简单和非正式。

1、着色简介

正如前面课程中多次提到的,渲染过程本质上可以分解为两个步骤:可见性和着色。 我们在上一课中介绍了两种解决可见性问题的技术:光栅化和光线追踪。 从现在开始,我们将介绍渲染过程的第二部分:着色(shading)。 着色是一个非常大的话题。 着色中使用的一些技术在数学上也可能很复杂。 尽管在本课程中,我们仅介绍着色的基础知识,并向你介绍最简单、最重要或常见的着色方法。 这将为你提供什么是着色的概述以及深入探索该主题的必要背景。

2、什么是着色?

到底什么是着色?

着色是渲染过程,包括计算 3D 场景中对象的颜色。 在渲染中,我们感兴趣的是再现从给定视点看到的对象的形状、可见性和外观。 渲染过程的可见性部分处理形状和可见性问题。 着色处理计算或模拟从给定视点看到的对象的颜色。

图1:计算场景中物体的颜色称为着色

视角在这里起着重要的作用。 我们将在本章中看到,物体的外观会随着视角的变化而变化。 对象的外观还取决于一些非常明显的参数,例如场景中的光量、表面相对于场景中光源的方向、对象的颜色等。什么有助于定义外观 或者物体的外观将在本章中回顾。 一般来说,事物为何看起来如此,与光与物质相互作用的方式有很大关系。 这一过程所涉及的原理如今已广为人知,并且通过定律得到了很好的描述,这些定律通常也很容易用计算机进行模拟。 着色依靠这些定律以一致且真实的方式模拟对象的外观。

在计算机图形学中,着色函数被定义为根据光源、物体和观察者位置的特征产生物体主体上每个点的强度值的函数。  — Phong, 1975

一幅画的真实感(photorealism)水平取决于画家在画布上再现人眼所见的真实表面颜色的能力。 如果照片真实感是目标,那么着色涉及到再现真实表面的外观或外观,其精确度使人眼无法再区分现实世界的图像和真实世界的图像世界本身。 照片真实感渲染(photorealistic rendering)的目标是生成看起来真实或看起来像照片的计算机生成图像。 着色是渲染过程的一部分,在此过程中定义对象的外观,它在照片级渲染中当然起着至关重要的作用。

图 2:乍一看,你在这里看到的这些图片看起来像是专业照片,但如果仔细观察其中一些,你会发现它们实际上是绘画。 才华横溢的艺术家西蒙·亨尼西 (Simon Hennessey) 创作了如此令人难以置信的逼真画作,看起来更像照片而不是绘画。

另一方面,非真实感渲染(简称 NPR:Non-Photorealistic Rendering)涉及创建或模拟各种艺术渲染风格。 NPR 的目标可以是再现真实的艺术技巧,例如油画或水彩画,或者开发只能通过计算机探索和生成的全新风格。

在本节的课程中,我们只对真实感渲染感兴趣。

3、着色的两个要素:照明和物体属性

当图像是由计算机生成时,我们就不能依靠画家的眼睛来决定图像中每个像素应该设置的颜色。 希望物体的外观,也就是我们想要在照片级真实感渲染中模拟的,“只是”本质上两件事的副产品:照明和物体的属性,并且这两个事物以及它们的相互作用可以用电脑模拟。 如果没有光,你就看不到物体,因此光在这个过程中起着至关重要的作用。 光线越多,物体就越亮。 至于物体的属性,我们基本上可以将它们分解为两大类:物体表面的几何属性(例如它们的方向)以及涉及光和物体交互方式的属性(例如物体的颜色)。

当我们“看到”一个物体时,我们看到的是该物体表面反射的光。 大多数物体不发光。 一般来说,光来自于我们所说的光源,即具有发光属性的特殊物体(太阳、灯泡、蜡烛的火焰都是光源的例子)。 通常,光由光源发出,落在物体(不发光)的表面上,并且该物体向观察者的方向反射部分光,如图 3所示。这种光在我们的大脑中形成我们所看到的物体的图像。 在着色中,这就是我们所说的直接照明(direct illumination):

图 3:光被物体反射。 眼睛看到这种反射光。 这是直接照明的示例

尽管由于对象反射落在其上的光,所以该光直接来自光源还是间接来自场景中的其他对象并不重要。 当一个物体将光反射到另一个物体的表面,而另一个物体又将这些光反射到观察者(或者至少是其中的一部分,我们将很快解释)时,我们称之为间接照明(indirect illumination),如图 4所示:

图 4:物体反射的光可以照亮场景中的其他物体。 这称为间接照明

请注意,光线在最终反射向观察者之前可能会从许多表面反射(图 5):

图 5:光在到达眼睛之前可能与之相互作用的物体数量理论上可以是无限的和/或实际上非常大

4、基本组成部分:N、P、L 和 V

这个快速介绍已经为我们提供了有关该过程中发生的情况的一些线索。 我们看到的并不是物体本身,而是物体表面反射的光。 光是能量,由光源发射并从物体表面反射。

现在,如前所述,表面的方向对于反射的光量起着重要作用。 我们都知道,如果我们将表面转向光源,它会变得更亮,或者如果我们将其远离光源,它会变得更暗。 正如我们将看到的,表面方向(关于光源)在着色中起着重要作用。 这就是物体表面的法线 N 对我们最有用的地方。 当然,我们可以改变表面相对于光的方向,或者改变光源相对于物体表面的位置。 改变表面方向或光位置(以及其相对于表面方向的方向)具有相同的效果。

图 6:物体表面上一点的亮度取决于该点的表面法线相对于入射光方向的方向。 当光方向与表面法线平行时,强度达到最大强度峰值

光方向 L 可以简单地通过从我们想要计算颜色的表面上的点 P 和光源位置追踪一条线(矢量)来定义(图 7)。 现在,我们假设灯光是 3D 空间中的无限小点。 我们还不知道如何计算 P 处的颜色,但我们知道它取决于 P(我们要计算其颜色的表面上的点)、N(P 处的表面方向,由表面法线 N 给出) 在 P 处,L 处是光方向(当然,光源的“亮度”也对 P 的亮度有影响,但我们稍后会讨论这一点)。 还有什么重要的?

图 7:如果表面是镜子,则入射角和反射角相等

到目前为止,我们解释了光是从物体表面反射的。 光是如何反射的,这是我们很快就会研究的问题,但是如何了解光反射到哪个方向呢? 光照射到表面的方向称为入射光方向(incident light direction)。 该向量与 P 处法线 N 形成的角度通常表示为 ωi(希腊字母 omega 和下标 i 代表“传入”,有时也使用希腊字母 θ,但我们将坚持使用 ω 的惯例,其他教育资源如 PBRT 的使用也是如此),通常称为入射角(angle of incident)。 完美的反射表面,例如镜面表面反射光线,就像网球从网球场地面弹起一样。 光线的出射方向与点 P 处的法线 N 形成角度,通常表示为 ωo(其中 o 在这种情况下代表“出射”)。 这个角度也称为反射角(angle of reflection)。 镜状表面的反射角和入射角受反射定律(law of reflection)支配。 它指出,当光线从表面反射时,入射角等于反射角(图 7)。 着色中的几乎所有内容都以某种方式源自这个简单的定律(尽管这并不意味着以后事情会那么简单)。

如果表面是完美的镜子,那么我们可以使用一些基本几何形状轻松找到出射光、反射方向 R(取决于你如何称呼它)的镜子。 计算该反射方向的完整方程将在接下来的章节中提供。

让我们将观察方向 V 定义为连接 P 和眼睛 (E) 或相机原点的线,如图 6 所示。 但请注意一些有趣的事情,如果观察者没有在与出射光方向相同的方向上精确地观察 P(即,如果 R != V),则光线将不会进入观察者的眼睛。 换句话说,观看者“将看不到光线或发射该光线的光源的图像”。 它会错过观看者(图 7)。 这是一个重要的观察结果,我们很快就会回到它(暂时记住它)。

然而,现实世界中很少有表面是完美的镜子。 大多数表面都是有光泽(shiny 或 glossy)或无光泽或漫反射(diffuse)的。 同样,这些术语可以互换使用,但在 CG 中,当涉及到无光泽表面时,我们更喜欢术语漫反射(diffuse)或朗伯(lambert)。 这两个术语很快就会得到解释。 是什么使表面变得有光泽而不是镜面或漫反射? 如果你愿意的话,光滑的表面就是“破碎的”镜子。 它们的表面并不完全光滑,可以看作是小面的集合,所有小面都单独充当小镜子,但或多或少以随机方向定向,如图 8 所示。因此,它们不是精确地沿镜子方向反射, 光线的反射方向与理想的镜子方向略有不同。 它们被反射离镜子方向有多远取决于小面的方向与“类似镜子”的表面平面的差异程度。 差异越大,反射光线就越有可能偏离镜面方向(并且表面越光滑)。

图 8:光泽表面是“破碎的”镜子。 它们的表面并不完全光滑,可以看作是小面的集合,所有小面都单独充当小镜子,但或多或少定向在随机方向上

光线在镜面方向以外的其他方向反射的效果是使反射图像模糊。 或者说同样的事情,但反过来说,物体表面上的模糊反射是由于表面破碎或粗糙并且以比镜面方向更大的方向反射光线的结果。 表面越粗糙,反射图像越模糊(图 9 和 10)。 总之,材质可以从完美的镜面变成非常粗糙的表面,如图 9 的动画所示。

图 9:不同级别的光泽度或粗糙度
图 10:略带波纹的湖面相当于粗糙的表面。 反射背景的图像稍微模糊

漫反射材质可以被视为与完美镜子完全相反,你可能会认为漫反射材质是非常粗糙的材质,尽管它们为什么是漫反射的通常与粗糙度本身关系不大。 漫射材料通常是表现出复杂内部结构的材料。 因此,光线会在物体的物质中“被困”一段时间,在最终离开物体之前在该结构的表面上多次反弹。 光线在这些内部结构上反射多次,以至于它们离开表面时的方向与其入射方向不相关。

图 11:漫反射材质

在CG中,我们喜欢说它们在P处离开物体表面时的方向是随机的。 当 100 条光线以相同的入射方向在 P 周围的一个非常小的区域内撞击表面时,我们最终得到的光线通常少于 100 条以随机方向离开表面(较少是因为某些光线可能已被物体吸收,但是这 是我们很快就会讨论的另一个主题)。

出于这个特殊原因,我们希望看到漫反射物体在以 P 为中心且以 P 处的法线 N 为中心的半球方向上的每一个可能的方向上均等地反射入射光,如图 12 所示。 这也意味着光泽和漫射材质对光的反应方式存在根本差异。

图 12:对于漫反射材质,光在表面上方的所有方向上均匀反射

由于漫反射材质在各个方向上均匀地反射光线,因此它们的亮度不会随观察方向而变化,而光泽材质则不然。 还记得我们之前说过的关于观察方向和镜面反射的内容吗? 如果它们不同,反射光线就不会进入眼睛,我们就看不到发出光线的光源的图像。 同样,当你改变对镜子的观察角度时,镜子反射的图像也会改变。 反射和光泽反射(只是粗糙表面的反射)与视角相关。 你所看到的物体或光源会被光滑的表面反射,具体取决于你的视角。

另一方面,漫反射(从光被环境中的物体反射的意义上来说,它也是一种反射)与视角无关。 你可以从各个角度观察它们,它们的亮度不会改变(这是因为漫反射材质在所有方向上均匀地反射入射光)。 这个区别非常重要。 你可以通过观察周围一些有光泽和漫射的物体来轻松体验它。 注意它们的亮度如何变化或不变化取决于你的视角。

我们需要快速介绍的着色的最后一个组成部分是解释为什么对象有颜色以及我们如何模拟它。 整个课程专门讨论色彩、色彩感知等主题。本课我们只会快速回顾一下整个过程。 我们在这里假设你熟悉“白”光由构成可见光谱的所有光谱颜色组成的想法。

当“白”光照射到物体时,其中一些颜色被物体吸收,而其他颜色当然会反射到环境中。 物体吸收的光谱颜色是物体材料本身的属性。 例如,橙色水果是橙色的,因为它吸收了大部分蓝色,只留下红光和绿光,它们混合(以加法模式)形成橙色(它也吸收了一些绿色,这就是为什么果实的橙色多于黄色)。

图 13:橙色的皮肤吸收了大部分蓝色,只留下红光和绿光,它们混合在一起(以加法模式)形成橙色

正如你所看到的,给定的材料可以吸收某些颜色的全部或仅一部分。 橙色果实吸收几乎所有的蓝色(例如 90%),吸收一小部分绿色(例如 40%),仅吸收极少量的红色(例如 10%)。 未被吸收的光被反射(10% 的蓝色加 60% 的绿色加 90% 的红色)。

但是我们如何定义物体的颜色呢? 首先,请注意,只有当对象以某种方式漫射时,颜色的概念才有意义。 尽管让事情变得复杂,但现实世界中的大多数材质在某种程度上都表现出这两种行为:它们具有漫反射成分和光泽成分。 它们很少完全是其中之一。 所以镜子本身没有颜色。 橙色水果的情况比较复杂。 它们有颜色,但看起来也有光泽。 这是因为大部分弥漫的橙色皮肤被一层非常薄的油性层覆盖,起到了镜子的作用。 油性透明层反射了落在水果上的一些光,但一些光也通过油性层传输到漫反射皮层,漫反射皮层作为漫反射表面反射光。 但物体的颜色可以定义为反射光与入射光量的比率。 在橙色水果示例中,蓝色比例为 0.1,绿色比例为 0.6,红色比例为 0.9(假设使用 RGB 颜色系统来表示颜色)。 从技术上讲,描述物体颜色的正确术语是反照率(albedo)。

5、结束语

在本章中,我们快速回顾了光与物质相互作用的基本原理,并制定了我们将在着色中使用的术语。 这些光与物质相互作用的原理很重要,因为它本质上是我们需要模拟以生成照片级真实图像的原理。 你应该记住,光会被物体反射。 在完全平坦的镜状表面上,反射方向由反射定律给出。


原文链接:What is Shading: Light-Matter interaction

BimAnt翻译整理,转载请标明出处