本专栏内容整理了GAMES101的计算机图形学课程的主要内容,作为我学习计算机图形学的一份复习备份或叫做笔记。内容中如有错误,或有其他建议,欢迎大家指出。
什么是漫反射
漫反射是指当有一根光线打到到物体表面后向各个方向均匀反射的现像。这种向四面八方的反射使得物体表面看起来不光滑,从而产生了物体的哑光外观。
那么我们要如何用程序将漫反射的现像模拟出来呢?
生活中当光线照射到一个单色立方体的各个面上,每个面面呈现出来的明暗是不一样的。这是为什么呢?
我们一起看下图中的例子,假如说光线是离散的,比如图中的光是由六根光线组成的。每根光线带有固定的能量。那么我们发现,当表面跟光线的入射方向是垂直的,那么这个面可以接受到这束光的所有能量。当我们将物体表面旋转了一定角度,这时候物体表面就只接受到了三根光线的能量,这个时候,这个物体表面就应该暗一些。
也就是说:一个物体表面的单位面积内,接受到的光线的方向向量L,跟物体表面法向量N的夹角就跟这个面的明暗有关系。
Blinn-Phong 对漫反射的模拟
光线传播
根据能量守恒定理,假设在光线传播过程中,能量没有衰减。那么,随着传播的距离越远,那么在这个距离半径处的圆表面积会加大,但是这个表面积承载的能量不变,所以单位面积内的能量就会减少。也就是说明:一个物体,离光源位置越远,那么,在这个物体的单位面积上能接收到的能量就越小。
可以分析出:光源传播出来能到达的光与物体到点光源的距离成平方反比,再根据shading-point表面法向量与入射光线夹角向量我们可以知道shading-point可以接受多少比例的光线。用能到达的光量和能接收到的比例相乘我们就可以得到一个shading-point的明暗度应该是多少。
在实际情况中还需要考虑物体表面会吸收多少能量,反射的能量 = 接受到的-吸收的。自然界中,不同的颜色会吸收不同的能量,我们同样可以模拟这样一个属性:Kd 。当Kd为1的时候表示吸收多少能量就反射多少能量(表现为光源颜色)。当我们把Kd用三维向量表示,表示为三通道颜色的rgb。那么我们就可定义这个shading-point的颜色了。
且因为漫反射是向空间中均匀反射,也就是说,你从任何一个角度去观察,shading-point展现的漫反射颜色应该都是一样的。也就是说漫反射项跟观测向量V没有任何关系。我们从图中右边的漫反射关系函数上也能看出来。向量V没有参与计算。只有光线向量和平面法向量参与了计算。
下图是颜色系数Kd对于漫反射结果的影响,从左到右,Kd越来越大
什么是镜面高光
回顾漫反射的公式。我们知道漫反射跟观测角度没有关系。而镜面高光反射就和我们的观测角度有关。
不同于漫反射向四面八方的反射。光滑的镜子会将光线反射到固定的一个方向上。好比我们小时候用镜子反射阳光照射到其他物体上。这些现像就是高光反射的现像。
现实生活中,当我们通过镜子去看到一个灯时或者太阳时会觉得非常的刺眼,因为光滑的镜面将光线光线都反射到我们的眼睛中来了。
所以我们就可以知道,高光反射除了漫反射的一些关系参数外,还跟我们的观测角度有关。
镜面高光会有一个固定的反射角V。当我们观测角R跟反射角V足够接近的时候,我们就会得到这么一个高光项。
Blinn-Phong对镜面高光的模拟
在布林冯模型中,利用了这么一个现像:当观察方向和反射方向接近时,就说明了平面法线方向和半程向量也是接近的。半程向量就是入射向量L和观测向量V之间夹角的角平分线的单位向量H。为什么使用半程向量?因为半程向量太好算了,计算过程见图。能节省计算。
所以也就是说当h和n之间的夹角越小的时候,高光就越强。布林冯中用向量点乘来判断两个向量是否接近。对比之前的漫反射项计算公式,我们就得到了镜面高光项的计算公式。
其中,Ks通常是用白色来表示因为高光通常是白色的。
公式中我们还会看到有一个指数p这个p就是高光的容忍度。通过下图,可以看出容忍度,表现的就是需要多大的角度才能看到比较好的高光表现,或者说用来控制高光范围有多大。
通过上图,我们可以看出当容忍度太低的时候,在观测角度和反射角度达到45度情况下依旧能得到一个还不错的高光表现,这不太合理。生活中的高光,通常观测角度跟反射角度之间的夹角都需要比较小,所以p不能设置的太小,通常来说在布林冯模型中p的值一般是100到200之间的值。
通过上图(图中是漫反射项和高光反射项结合在一起渲染的),我们可以看到:随着Ks的加大,高光的亮度越来越大,随着p的增大,高感光的范围越来越小,高光边缘也越来越锐利。
什么是环境光
环境光是指不直接来自光源的光,它来自物体周围所有方向的间接光。环境光提供了场景的基本光照,使得即使在没有直接光源照射的阴影区域,场景中的物体也能被看见。这种光照模拟了现实世界中光线如何被物体表面反射并从多个方向照射到其他物体上,从而为整个场景提供了一致的亮度。
回顾我们前面介绍的茶杯图。会发现在没有接收到光线照射的部分依旧能呈现出颜色或明度而不是黑的,这是因为在真实环境下,光线会在空间中的各个物体表面进行反射,光线就会通过非常多非常多次的物体表面反射到达原本无法直接到达的点上。同样,这个点就会接收到来自四面八方的光线。然后再反射到我们的眼睛中。在计算机图形学中,模拟这样的一个过程,就叫做:全局光照-光线追踪。光线追踪非常复杂,且需要大量的计算力。
Blinn-Phong 对环境光的模拟
在布林冯这样的一个简单模型中没有使用光线追踪的方法,而是使用了一个大胆的假设:在场景环境中的任何一个点接受到的来自环境的光都是相同的而这个强度叫做Ia(ia),又因为环境光是来自四面八方的,所以这个环境光没有光线入射方向,且环境光的表现与我们的观测方向也无关,所以环境光它是一个常数。如果环境光是一个常数,那么我们看到的环境光项表现出来就是某一个颜色。
Blinn-Phong 布林冯反射模型
接下来,我们将前面讲到的三个反射项组合在一起就得到了布林冯反射模型。
通过设置布林冯模型的各个计算参数,我们就得到了可以模拟各种物体表面的材质Materials。比如金属,塑料,石灰面等等。
而接下去要讲的着色就是将不同材质(Material)应用在不同物体(Mesh)上的一个过程。