NND总算考完试了。。。而且前几天还和季老一起研究开发个2D伪游戏引擎,所以光照模型这块一直没看,这会儿把最后两个经验模型总结一下,权当复习了,然后就开始看高级光照模型。。
上次说到Lambert漫反射光照模型,这是一个用来模拟粗糙表面对光线的漫反射现象的经验模型,对于纸张、粗糙墙壁等等来说,这个模型或许够用,但对于金属这样的光滑表面来说,我们就需要使用Phong模型来模拟光滑表面对光线的镜面反射现象。同Lambert一样,这个模型也是经验模型,而且在程序中,我们经常同时使用Lambert和Phong两个模型,因为在现实世界中,任何表面都会同时发生漫反射和镜面反射两种现象,因此我们就要使用两种模型分别计算两种反射后的光强(也就是顶点颜色值),是渲染的效果看起来真实一些。但要注意,这样做并不会带来真正真实的渲染效果,毕竟这两种模型都是经验模型,考虑的都是理想情况下。而Blinn-phong光照模型是基于Phong的修正模型,因此就一并归纳了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
接下来让我们看看Phong模型:
我们知道,在理想状况下,镜面反射后的光之集中在一条线上,因此我们的视线离这条线的距离越近,射入我们眼中的光线就越多,我们看到的光强也就越强。同时,镜面反射也与物体表面的高光指数(物体表面光泽程度)有关,其数值越大,反射后的光线越集中,反之则越分散,这里可能会有人想:如果将高光指数设置的很大,也就是光线极其分散,Phong是否可以用来代替Lambert?我想答案肯定是不行的,原因是漫反射是将光线反射到各个角度,而镜面反射即使反射光线再分散,它们依旧被限制在一个90度的区域中,因此与漫反射的效果是不一样的。
下面给出公式:
I_spec = k_z * I_l(V • R)^n_s
其中:k_z为表面材质的镜面反射系数,n_s是高光指数,V表示顶点到视点的向量,R表示反射光的单位向量。
但是在实际的程序编写中,我们一般都会更容易得到入射光线的单位向量L,所以我们最好转换一下公式。设顶点的单位法向量为N,有公式:
R + L = (2N • L)N (这里再次提醒一下,L的方向是由顶点指向光源的)
由这个可以推出:
R = (2N • L)N - L
所以模型公式可以变为:
I_spec = k_z * I_l(V • ((2N • L)N - L))^n_s
下面是用Cg语言实现Phong模型的代码:
/******************************************************/
/*Phone镜面光照模型,同时也加入了Lambert漫反射光照模型 */
/******************************************************/
struct vertex_In
{

本文介绍了Phong和Blinn-Phong两种光照模型,用于模拟光滑表面的镜面反射。Phong模型通过计算V•R来模拟高光,Blinn-Phong用N•H替代,提供更平滑的高光效果,且运算速度更快,常用于图形渲染。文章还提供了Cg语言实现这两种模型的代码示例。

6406

被折叠的 条评论
为什么被折叠?



