基于Phong模型的多光源闪烁仿真

时间:2022-08-20 04:49:08

摘要:真实感图形绘制中的光照是计算机图形学的热点问题。该文介绍了Phong光照模型及其的OpenGL实现。结合一个多光源闪烁的实例,详细叙述真实感图形的光照处理过程。该方法对舞台灯光的仿真有一定的参考价值。

关键词:真实感图形;Phong模型;OpenGL;灯光

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)22-6317-02

Multi-light Blink Simulation Based on Phong Model

LU Ping

(College of Science, Xi'an University of Architecture and Technology, Xi'an 710055, China)

Abstract: The light is realistic graphics rendering of computer graphics. The paper introduced the Phong model and the realization with OpenGL. Describe the details of the realistic graphics light processing combined with a example. The method has certain reference value for stage light's simulation.

Key words: realistic graphics; phong model; OpenGL; light

真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学和其它科学知识在计算机图形设备上生成象彩色照片那样的具有真实感的图形。在现实生活中的物体,要有光照存在才可以被看到。物体通过自身发光以及反射光进入人眼,物体才能在人眼中成像,即根据基于光学物理的光照模型计算可见面投射到观察者眼中的光亮度大小和颜色分量,并将它转换成适合图形设备的颜色值,从而确定投影画面上每一象素的颜色,最终生成图形。OpenGL中可以根据光照条件创造出跟真实世界非常接近的图形。除了物体本身发光以外,还可以定义三种类型的光照:环境光、散射光和镜面光。

1 Phong光照模型

在三维可视化中,引入外部光源可以在三维重建物体的可见面上产生自然光照,使物体的三维重建达到现实世界中人眼直接观察的逼真效果,具有空间感。在体绘制中利用Phong光照模型来计算物体对外部光照的反射效果。

Phong光照模型建立于物体表面的光反射基础上,把表面上某点的反射光分解为环境光、漫射光和镜面光三种反射分量,根据光的入射方向(L)、表面法向(N)和观察视线(V)之间的角度关系,以及反映表面材质属性的光反射系数、镜面指数等来确定反射光的强度。Phong光照模型可由下式表示[1]:

其中Ia为环境光的强度,Ip为点光源的强度,Ka,kd,Ks为反射系数,0≤Ka,Kd,Ks≤1.0,分别代表物体表面反射环境光、产生漫反射和产生镜面反射的能力。

可以引进一个用衰减Ip的因数以反映光的强度随光源与表面上的点之间距离d的增加而减弱的现象。当场景中有两个或更多的光源时,它们的效果时积累的:

2 OpenGL实现Phong光照模型

在OPENGL中仅处理三种光:镜面反射光、环境光和散射光 [2]。设置光照时要分别设置光源的各种参数和物体材质的各种参数。

2.1 全局环境光

全局环境光不来自任何特定的光源,用参数GL_LIGHT_MODEL_AMBIENT说明:

GLfloatlmodel_ambient[]={0.2,0.2,0.2,1.0};

glLightModelfv(GLLIGHT_MODEL_AMBIENT,lmodel_ambient);

这些数值产生小量的白色环境光。

2.2 近视点与无穷远视点

视点位置能影响镜面高光的计算,即顶点的高光强度依赖于顶点法向量。调用光照函数并不能移动视点,但是可以对光照计算作出不同的假定,这样视点似乎移动了。对于一个无穷远视点,视点到任何顶点的方向保持固定。对于一个近视点,物体每个顶点到视点的方向是不同的,需要逐个计算,从而整体性能降低,但效果更真实。函数

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE); 假定为近视点,把视点放在视点坐标系的原点处。若要切换到无穷远视点,只需将参数GL_TRUE 改为GL_FALSE即可。

2.3 双面光照

光照计算通常是对所有多边形进行的,无论其是正面或反面。若对内部多边形需进行光照计算,调用函数glLightModeli(LIGHT_MODEL_TWO_SIDE,GL_TRUE);启动双面光照。

2.4 光源位置与衰减

无穷远光源又称作定向光源,即这种光到达物体时是平行光,如太阳光。近光源又称作定位光源,光源在场景中的位置影响场景的光照效果,尤其影响光到达物体的方向,如台灯。

GLfloatlight_position[]={1.0,1.0,1.0,0.0};

glLightfv(GL_LIGHT0,GL_POSITION,light_position);

光源位置坐标采用的齐次坐标(x, y, z, w),w为0是定向光,(x, y, z)描述光源的方向。若w非零,光源为定位光源。(x, y, z, w)指定光源在齐次坐标系下的具置,这个位置经过模型变换等在视点坐标系下保存下来。

2.5 聚光

定位光源可以定义成聚光灯形式,即将光的形状限制在一个圆锥内。OpenGL中聚光的定义有以下几步:

1) 定义聚光源位置。因为聚光源也是定向光源,所以他的位置同一般定向光一样。如:

GLfloatlight_position[]={1.0,1.0,1.0,1.0};

glLightfv(GL_LIGHT0,LIGHT_POSITION,light_position);

2) 定义聚光截止角。

3) 定义聚光方向。

4) 定义聚光指数。

3 多光源闪烁实现

概括来说,在OpenGL中对物体作光照处理的步骤是:

1) 定义物体各顶点法相矢量,已确定物体与光源的相对位置。

2) 设置光源。

3) 选择光照模型。

4) 定义被照射物体的材质属性。

按照前述方法定义红色的聚光:

GLfloat light1_ambient[]= { 0.2, 0.2, 0.2, 1.0 };

GLfloat light1_diffuse[]= { 1.0, 0.0, 0.0, 1.0 };

GLfloat light1_specular[] = { 1.0, 0.6, 0.6, 1.0 };

GLfloat light1_position[] = { -3.0, -3.0, 3.0, 1.0 };

GLfloat spot_direction[]={ 1.0,1.0,-1.0};

glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);

glLightfv(GL_LIGHT1, GL_SPECULAR,light1_specular);

glLightfv(GL_LIGHT1, GL_POSITION,light1_position);

glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 30.0);

glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION,spot_direction);glEnable(GL_LIGHT1)

在场景中最多可以设置八个光源。在多光源情况下,OpenGL需计算每个顶点从每个光源接受的光强,这样会增加计算量,降低性能,因此在实时仿真中最好尽可能地减少光源数目。图1为4个位置不同的独立光源照在小球上,在VC++平台上实现。点击面板右侧的方框可以控制灯源开闭。点击下方“开始”按钮可以让光源轮流启动,依次是红色、蓝色、绿色、青色,以实现闪烁的效果。

4 小结

基于Phong模型的多光源,在给定的场景中,定义多种固定光源,包括泛光、镜面光、环境光的设定,观察对同一材质使用多个光源之间的影响。该设计及实现为仿真舞台灯光效果提供了有效的方案。

参考文献:

[1] 项志钢.计算机图形学[M].北京:清华大学出版社,2008.

[2] 和平鸽工作室. OpenGL三维图形系统开发与实用技术[M].北京:清华大学出版,2003.

[3] 孙家广.计算机图形学[M].3版.北京:清华大学出版社,2005.

[4] 任爱华.计算机图形学[M].北京:北京航空航天大学出版社,2005.

上一篇:基于LabVIEW的频谱测量仪研发及实现 下一篇:宾馆信息语音检索系统的研究