光照和着色处理

光照用来表示材质和光源之间的相互作用。光照可以和颜色,纹理,以及透明度等一起使用,共同形成屏幕上的视觉外观效果。

主要存在三种类型的着色处理方法:扁平、Gouraud、Phong。这3种方法分别基于多边形,顶点,像素来计算光照效果。

扁平着色处理是以三角形为单位进行颜色计算,然后用这种颜色对三角形进行填充。(用扁平方式进行着色处理的图像没有镜面高光成分)

Gouraud着色处理首先计算三角形每个顶点处的光照,然后用顶点颜色通过插值来计算三角形内部各点的光照。Gouraud着色处理效果高度依赖所要绘制的物体的细节层次,还存在丢失高光、无法捕捉聚光效果、马赫带效应问题。对于这些局限性,可以通过使用纹理来表现照明效果来克服。

Phong着色处理用三角形各顶点处的法向量通过插值的方式计算每个像素处的法向量,然后根据各个像素的法向量计算光照效果。


Gouraud方法其实可以通过将表面细分为比像素更小的三角形,取得和Phong一样的效果。(主要用于电影制作)

顶点或像素处的光照可以用光照模型来计算。所有模型都非常相似,均可以分解为3个主要部分:漫反射分量、镜面反射分量、环境分量。

1)漫反射分量

漫反射是一个基于Lambert定律的几何属性。漫反射分量的目的是捕捉不光滑表面的行为。漫反射分量可以表示为:idiff = n · I = cos,其中n为表面法向量,I为光向量(与光照方向相反),它们都经过归一化处理。当 Θ > pi/2 时,漫反射光照为0。

Lambert定律的几何解释:


其中,l 为光线之间的距离,光照强度与该距离有关,Θ 为光线与表面法向量的夹角,可以计算出光线在表面上的距离为 l/cosΘ 。

为了利用光源的漫反射颜色 sdiff 和材质的漫反射颜色 mdiff,可以将 idiff 写成 idiff = (n · I)mdiff * sdiff . * 表示分量乘法

考虑到当 n 和 I 之间的角度大于90°,漫反射为0,则 idiff = max ( ( n · I ) , 0 ) mdiff * sdiff

2)镜面反射分量

镜面反射分量的目的是通过产生高光来使物体表面出现闪闪发光的效果。

如下所示为一个用图形硬件模拟高光效果的模型,其中 v 是从表面点 p 到视点之间的距离,r 是光线向量 I 在法线 n 周围的反射。

ispec = ( r · v )mshi =(cosρ)mshi 。mshi 描述了表面的光亮度,mshi 越大,物体表面越亮。这个方程称为Phong光照方程(不要和Phong着色处理混淆)。

光向量 I 在法线 n 附近反射,产生反射向量 r,r 的计算公式为: r = 2 ( n · I ) n - I ,其中 n,I 都是归一化后的,所以 r 也是归一化的。


反射向量 r 的推导:


ispec 的另一种形式:

ispec = ( n · h )mshi = (cosθ)mshi . 其中 h 是 I 和 v 之间的归一化半向量:h = I + v / || I + v ||

利用光源的高光颜色和材质的高光颜色后: ispec = max( ( n · h ) , 0 )mshi mspec * sspec

3)环境分量

本文转自:博客园 - 廉江宏(朴者),转载此文目的在于传递更多信息,版权归原作者所有。

最新文章