原作者Paul Nettle,感谢!需要原文的朋友可以google之 (^ ^)
很多人把冯氏光照(Phong Illumination)和冯氏渲染(phong shading)混淆到一起。冯氏渲染是指计算基于每像素的与表面相交的法向量的插值过程。你可以对每个像素做你喜欢的光照效果,或者对每个顶点做冯氏光照计算,在物体表面使用高洛德着色(Gouradu shading)。
冯氏光照是由Phong Bui-Tuong(冯布桐?抱歉我不知道怎么翻译,看着这个名字我想起来我第一次见到c++之父,bjarne stroustrup时的迷惑。。。。 PS:我见到对C++老爹比较权威的翻译是:比亚尼,斯特鲁普 >_<,如果你知道冯先生/女士的名字,请告诉我怎么翻译,谢谢!!!)在1975年提出的.由于冯氏模型使用一般的文本比较难表示(主要是缺乏希腊字母),所以下面使用简称代替希腊字母所代替的意思:
Ix = 最终结果的色彩
Lx = 光照色彩
Ax = 环境光色彩
Dx = 漫反射色彩
Sx = 镜面反射色彩
Ka = 环境系数
Kd = 漫反射系数
Ks = 镜面反射系数
Att = 衰减系数
n = 光滑或者粗糙度
N = 物体表面的法向量
L = 指向光源的向量
R = 反射向量
V = 视点向量
下面就是冯氏模型:
Ix = Ax*Ka*Dx + Att*Lx[Kd*Dx( N dot L) + Ks*Sx(R dot V)^n]
Ix~Sx的值都含有组件值.对于RGB模型来说,这些组件值分别代表着(R,G,B)分量,范围为[0.0,1.0],所以这个模型对应的RGB解决方案如下:
Ir = ArKaDr + AttLr [KdDr(N dot L) + KsSr(R dot V)^n]
Ig = AgKaDg + AttLg [KdDg(N dot L) + KsSg(R dot V)^n]
Ib = AbKaDb + AttLb [KdDb(N dot L) + KsSb(R dot V)^n]
Ka~Ks这三个值范围为[0.0,1.0],一般作为材质(material)信息存储在材质表面定义中.Ka表示物体表面受环境光照影响的的程度.Kd表示物体自身反射光的程度.Ks表示光被反射后的强度.Att用于表示光线的衰减,指光源到物体光线的衰减.你可以定义另一个衰减表示物体到观察者之间光线的衰减.n用来判断镜面反射的范围,值越大,范围越小.这个值的选择主要靠经验,为了获得一个感性认识,可以试试3.0,200.0,和10000.0这几个值.
在冯氏渲染中,N是与表面相交的一个插值.在每个像素上,它被标准化用于冯氏光照等式上.L是指向光源的向量,R是被表面反射后的光向量,R的计算可以使用下面式子计算:
2N(N dot L) – L
V是从物体表面到观察者的向量.
以上信息可以从下面资料中获得:
"Computer Graphics Principles and Practice, 2nd edition" by Foley, van Dam, Feiner, Hughes