本专栏内容整理了GAMES101的计算机图形学课程的主要内容,作为我学习计算机图形学的一份复习备份或叫做笔记。内容中如有错误,或有其他建议,欢迎大家指出。
引导:
我们观察下图,每个立方体都有不同的颜色,并且每个立方体的每个面的颜色都有深浅的区分。当我们将场景中一大堆的三角面都绘制到屏幕上时,对应的屏幕上的像素应该填充什么颜色?这就是着色的问题
所谓着色 Shading
In Merriam-Webster Dictionary
shad·ing, [ˈʃeɪdɪŋ], noun
The darkening or coloring of an illustration or diagram with parallel lines or a block of color. The process of applying a material to an object
在计算机图形学课程中我们可以这么理解:对不同物体,应用不同材料的一个过程
Blinn-Phong (布林冯反射模型)
上图场景中描述了在一个光亮的空间内有几个堆叠在一起的杯子,被右上方的光源照射的一个静态场景。
在杯子的右侧区域,我们可以明显的看到有接近亮白色的高光部分。这部分被称为:镜面高光
Specular highlights(镜面高光)这是指当光线照射到光滑的表面时,反射光会在表面上形成明亮的光斑。镜面高光在3D图形中非常重要,因为它们为物体的形状和与场景中光源的位置提供了强烈的视觉线索。
在镜面高光的左侧有一部分区域颜色变化比较柔滑,这部分的反射叫漫反射。
Diffuse reflection(漫反射)这是一种光线照射到物体表面后,被均匀散射到各个方向的现象。漫反射使物体表面看起来没有明显的光泽,给人一种粗糙或哑光的感觉(比如我们现实中的石灰墙面)。这种反射类型是创建现实感图像时的一个基本要素。
再往左侧,有一部分,没有接受到光源的直接照射,按理这部分应该被杯子右侧的部分遮挡住(类似 缺月 ),无法反射光线到我们的眼睛里,但是我们依然能够看见这一部分。这是因为在环境中光线会在各个物体表面,墙面反射。所以杯子最左侧一部分会接收到来自四面八方的一个反射光。为了简化这部分的光照,我们将这部分光照模拟为场景中固定存在的光照,称为环境光。
Ambient lighting(环境光)环境光是一种光源,它以固定的强度和颜色影响场景中的所有对象。这种光源不依赖于特定位置,提供了对间接光照的一个非常基础的近似,帮助创建更自然的场景感觉。环境光通常用来模拟天空散射的光线,或者在室内场景中模拟没有直接照射到的区域的光线。
从上图的分析中,我们可以看到单从光照上来看,着色可以分为三种不同的部分。镜面高光,漫反射和环境光。我们将这三部分都分析表示出来就可以得到一个材质-material。
局部着色 Shading is Local
我们在做光照的模拟上,我们是对我们看到的某一个点上进行考虑。我们假设我们看到的这个点叫做 shading-point。并且局部着色只需要考虑自己的着色情况。不需要考虑其他物体的影响(比如说不会考虑阴影投射)。接下来我们处理对于这个点的着色结果应该是什么。
这个shading-point首先应当是在某一个物体表面上,虽然一个物体表面可能是曲面,但是在一个点上这么个极小范围内我们可以将其看做是一个平面(微分思想)。那么我们就可以对这个微小的面做一个法线n。我们再规定另外两个方向:相机观测方向:v,还有从点看向光源的一个方向叫光照方向L。且需要将这些向量定义为单位向量。
此外,在这个面上还有一些物体表面的属性,比如颜色,和光泽度等。(光泽度决定了镜面高光的大小和亮度)。