Phong光照模型及OpenGL实现(一)

phong模型

phong模型是一种经典的局部光照模型,支持点光源以及方向光源。phong模型将局部光照分为漫反射、镜面反射以及环境光三个部分。

漫反射

漫反射是指光线被粗糙表面无规则地向各个方向反射的现象,如图1。
Phong光照模型及OpenGL实现(一)_第1张图片
图中蓝线表示入射光,橙线表示反射光。漫射光的传播是各向同性的,即不同方向上的光强,颜色均为相同的。
那么怎么求出漫射光的光强呢?我们可以利用下面这个公式
I d = I i K d ∗ ( L ⋅ N ) I_{d} = I_{i}K_{d}*(L\cdot{N}) Id=IiKd(LN)
首先我们来解释各个参数代表的含义
I d I_{d} Id:漫反射光的强度
I i I_{i} Ii:入射光
K d K_{d} Kd:漫反射系数(包括 K d r K_{dr} Kdr K d g K_{dg} Kdg K d b K_{db} Kdb,三种不同颜色通道的系数)
L L L:L指的是入射光的方向(与上图中不同的是,入射光方向在公式中一般会做取反操作)
N N N:法线方向
接下来,我们分析这个公式。
( L ⋅ N ) (L\cdot{N}) (LN):符合常识的是当入射光垂直于物体表面时,物体的漫反射光是最强的,当L与N均为单位向量时, ( L ⋅ N ) (L\cdot{N}) (LN)就可以表示两方向向量之间的cos值,那么就可以模拟入射光在不同角度照射物体时得到的不同反射光强。
故, I d = I i K d ∗ ( L ⋅ N ) I_{d} = I_{i}K_{d}*(L\cdot{N}) Id=IiKd(LN)可以简化的模拟出漫反射的特点。

镜面反射

镜面发射发生在光滑的物体表面。依据反射定律,反射光线往往集中于一个较小的立体角内,我们将其称作镜面反射光,如图2所示。
Phong光照模型及OpenGL实现(一)_第2张图片
同上,蓝线为入射光线,橙线为反射光线。镜面反射光的计算公式如下
I s = I i K s ∗ ( R ⋅ V ) n I_{s} = I_{i}K_{s}*(R\cdot{V})^n Is=IiKs(RV)n
同样,我们来解释每一项参数代表的意义:
I s I_{s} Is:镜面反射光的强度
I i I_{i} Ii:入射光
K s K_{s} Ks:镜面反射系数(包括 K s r K_{sr} Ksr K s g K_{sg} Ksg K s b K_{sb} Ksb,三种不同颜色通道的系数)
R R R:反射光线方向
V V V:视角方向
n n n:n是反射系数,n越大,则高光区域越集中
接下来,我们分解这个公式。
同上, ( R ⋅ V ) (R⋅V) (RV)的是R和V的余弦值(同样假设R、V已经规范化为单位向量),在 ( R ⋅ V ) n (R\cdot{V})^n (RV)n,由于 ( R ⋅ V ) (R⋅V) (RV)位于区间[0,1]之间(负区间舍去),随着 n n n的增大, ( R ⋅ V ) n (R\cdot{V})^n (RV)n逐渐减小,这样镜面发射形成的光斑就是中心区域明亮,周围相较暗淡的,符合实际的情况。
故, I s = I i K s ∗ ( R ⋅ V ) n I_{s} = I_{i}K_{s}*(R\cdot{V})^n Is=IiKs(RV)n可以模拟出镜面反射的特点。

环境光

就像我们位于室内时,关闭灯光,关上门窗,但室内却不是完全黑暗的,这就是环境光,环境光实际上仍然是光间接作用的结果,但phong模型为了简化这一模型,就忽略掉光线的间接作用,直接使用下列公式表示环境光。
I a = I i K a I_{a} = I_{i}K_{a} Ia=IiKa
这个公式较为简单,不再解释。

总结

总的phong模型得到的光照就是以上三个模型的加和,即:

I = I a + I d + I s I_{} = I_{a}+I_{d}+I_{s} I=Ia+Id+Is
为了使计算机绘制出来的物体更加具有真实感,还需要对物体做明暗处理,下一篇博文会介绍phong插值,以及利用OpenGL模拟方向光光照。

你可能感兴趣的:(计算机图形学,OpenGL)