版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OpenGL,基础图形编程,OpenGL,光照,张志华,数理学院,第十章,OpenGL,光照,本章是比较重要的一部分,前几章只是基础,在,这章里将着重讲述光照模型、明暗处理、光源设置,材质定义以及有关的计算机图形学概念等内容,介绍,如何运用,OpenGL,函数来绘制真实感图形,充分展示,三维图形世界的魅力。如果读者以前从未接触过这方,面的概念,要直接应用,OpenGL,函数库编写三维图形,程序,是很困难的。因此,我们将结合,OpenGL,的特,殊性简洁明了地介绍一些有关真实感图形绘制的概念,帮助读者理解基本的,OpenGL,光照、材质等函数的应,用方式,顺利掌握最基本的真实感图形编程方法,引,
2、导读者快速进入,OpenGL,三维图形世界,第十章,OpenGL,光照,10.1,真实感图形基本概念,真实感图形绘制是计算机图形学的一个重要,组成部分,它综合利用数学、物理学、计算机科,学和其它科学知识在计算机图形设备上生成象彩,色照片那样的具有真实感的图形,一般说来,用,计算机在图形设备上生成真实感图形必须完成以,下四个步骤,第十章,OpenGL,光照,四个步骤,一是用建模,即用一定的数学方法建立所需三维场景的几,何描述,场景的几何描述直接影响图形的复杂性和图形绘,制的计算耗费,二是将三维几何模型经过一定变换转为二维平面透视投影,图,三是确定场景中所有可见面,运用隐藏面消隐算法将视域,外或被
3、遮挡住的不可见面消去,四是计算场景中可见面的颜色,即根据基于光学物理的光,照模型计算可见面投射到观察者眼中的光亮度大小和颜色,分量,并将它转换成适合图形设备的颜色值,从而确定投,影画面上每一象素的颜色,最终生成图形,第十章,OpenGL,光照,由于真实感图形是通过,景物表面的颜色和,明暗色调来表现景物的几何形状、空间位置以,及表面材料的,而一个物体表面所呈现的颜色,是由表面向视线方向辐射的光能决定的,在计算机图形学中,常采用一个既能表示光能,大小又能表示其颜色组成的物理量即光亮度,luminance,或光强,intensity of light,来描述物体表面朝某方向辐射光能的颜色。采,用这个
4、物理量可以正确描述光在物体表面的反,射、透射和吸收现象,因而可以正确计算出物,体表面在空间给定方向上的光能颜色,第十章,OpenGL,光照,物体表面向空间给定方向辐射的光强可应用光照模,型进行计算。简单的光照模型通常假定物体表面是光滑的,且由理想材料构成,因此只考虑光源照射在物体表面产生,的反射光,所生成的图形可以模拟出不透明物体表面的明,暗过渡,具有一定的真实感效果,复杂的光照模型除了考虑上述因素外,还要考虑周围环境,的光对物体表面的影响。如光亮平滑的物体表面会将环境,中其它物体映像在表面上,而通过透明物体也可看到其后,的环境景象,这类光照模型称为整体光照模型,它能模拟,出镜面映像、透明等较
5、精致的光照效果,第十章,OpenGL,光照,为了更真实的绘制图形,还要考虑物体表面的细节纹理,这通常使用一种称为“纹理映射”,texture mapping,的技术把已有的平面花纹图案映射到物体表面上,并在,应用光照模型时将这些花纹的颜色考虑进去,物体表面,细节的模拟使绘制的图形更接近自然景物,以上内容中,真实感图形绘制的四大步骤前两步在,前面的章节已经详细介绍过,这里不再重复,第三步,OpenGL,将自动完成所有消隐过程,第四步下面几节详,述。另外,部分复杂光照模型应用将在后续章节里介绍,第十章,OpenGL,光照,10.2,光照模型,10.2.1,简单光照模型,当光照射到一个物体表面上时,
6、会出现三种情形,首先,光可以通过物体表面向空间反射,产生反射光,其次,对于透明体,光可以穿透该物体并从另一端射出,产生透射光,最后,部分光将被物体表面吸收而转换成热,在上述三部分光中,仅仅是透射光和反射光能够进入人眼,产生视觉效果。这里介绍的简单光照模型只考虑被照明物,体表面的反射光影响,假定物体表面光滑不透明且由理想,材料构成,环境假设为由白光照明,第十章,OpenGL,光照,一般来说,反射光可以分成三个分量,即,环境反射,漫反射和镜面反射,环境反射分量,假定入射光均匀地从周围环境入射至景物表面并,等量地向各个方向反射出去,通常物体表面还会受到从周围环境来的,反射光(如来自地面、天空、墙壁等
7、的反射光)的照射,这些光常统,称为,环境光,Ambient Light,漫反射分量,表示特定光源在景物表面的反射光中那些向空间各,方向均匀反射出去的光,这些光常称为漫射光,Diffuse Light,镜面反射光,为朝一定方向的反射光,如一个点光源照射一个金属球,时会在球面上形成一块特别亮的区域,呈现所谓“高光,Highlight,”,它是光源在金属球面上产生的镜面反射光,Specular Light,。对于较光滑物体,其镜面反射光的高光区域小,而亮;相反,粗糙表面的镜面反射光呈发散状态,其高光区域大而不,亮,下面先看一个简单的光照例程,第十章,OpenGL,光照,例,10-1,简单光照例程,l
8、ight0.c,include glos.h,include,include,include,void myinit(void,void CALLBACK myReshape(GLsizei w,GLsizei h,void CALLBACK display(void,第十章,OpenGL,光照,void myinit(void,GLfloat light_position = 1.0, 1.0, 1.0, 0.0,glLightfv(GL_LIGHT0, GL_POSITION,light_position,glEnable(GL_LIGHTING,glEnable(GL_LIGHT0,gl
9、DepthFunc(GL_LESS,glEnable(GL_DEPTH_TEST,第十章,OpenGL,光照,void CALLBACK display(void,glClear(GL_COLOR_BUFFER_BIT ,GL_DEPTH_BUFFER_BIT,auxSolidSphere(1.0,glFlush(,第十章,OpenGL,光照,void CALLBACK myReshape(GLsizei w, GLsizei h,glViewport(0, 0, w, h,glMatrixMode(GL_PROJECTION,glLoadIdentity(,if (w = h,glOrtho
10、 (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0,else,glOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0,glMatrixMode(GL_MODELVIEW,glLoadIdentity(,第十章,OpenGL,光照,void main(void,auxInitDisplayMode (AUX_SINGLE ,AUX_RGBA,auxInitPosition (0
11、, 0, 500, 500,auxInitWindow (Simple Lighting,myinit(,auxReshapeFunc (myReshape,auxMainLoop(display,第十章,OpenGL,光照,以上程序运行结果是显示一个具有灰色光影的球。其中函,数,myinit(,中包含了关键的设定光源位置、启动光照等几,句,而其它程序语言几乎与以前的没有多大区别,但效果,却完全不一样。下面几个小节将详细介绍有关函数的用法,第十章,OpenGL,光照,10.2.2 OpenGL,光组成,在,OpenGL,简单光照模型中的几种光分为,辐射,光,Emitted Light,环境光,
12、Ambient Light,漫射光,Diffuse Light,镜面光,Specular,Light,辐射光是,最简单的一种光,它直接从物体发出并,且不受任何光源影响,环境光是,由光源发出经环境多次散射而无法确定,其方向的光,即似乎来自所有方向。一般说来,房间,里的环境光成分要多些,户外的相反要少得多,因为,大部分光按相同方向照射,而且在户外很少有其他物,体反射的光。当环境光照到曲面上时,它在各个方向,上均等地发散(类似于无影灯光,第十章,OpenGL,光照,漫射光,来自一个方向,它垂直于物体时比倾斜时,更明亮。一旦它照射到物体上,则在各个方向上均匀,地发散出去。于是,无论视点在哪里它都一样亮
13、。来,自特定位置和特定方向的任何光,都可能有散射成分,镜面光,来自特定方向并沿另一方向反射出去,一,个平行激光束在高质量的镜面上产生,100,的镜面反,射。光亮的金属和塑料具有很高非反射成分,而象粉,笔和地毯等几乎没有反射成分。因此,三某种意义上,讲,物体的反射程度等同于其上的光强(或光亮度,第十章,OpenGL,光照,10.2.3,创建光源,Light Source,光源有许多特性,如颜色、位置、方向等。选择,不同的特性值,则对应的光源作用在物体上的效果也,不一样,这在以后的章节中会逐步介绍的。下面详细,讲述定义光源特性的函数,glLight*(,void glLightifv(GLenum
14、 light , GLenum,pname, TYPE param,创建具有某种特性的光源。其中第一个参数,light,指定所创建的光源号,如,GL_LIGHT0,GL_LIGHT1,GL_LIGHT7,第二个参数,pname,指定光源特性,这个参数的辅助信息见表,10-1,所示,最后一个参数设置相应的光源特性值,第十章,OpenGL,光照,注意:以上列出的,GL_DIFFUSE,和,GL_SPECULAR,的缺,省值只能用于,GL_LIGHT0,其他几个光源的,GL_DIFFUSE,和,GL_SPECULAR,缺省值为,0.0,0.0,0.0,1.0,另外,表中后六个参数的应用放在下一,篇中
15、介绍。在上面例程中,光源的创建为,GLfloat light_position = 1.0, 1.0, 1.0, 0.0,glLightfv(GL_LIGHT0, GL_POSITION,light_position,第十章,OpenGL,光照,其中,light_position,是一个指针,指向定义的光源位,置齐次坐标数组。其它几个光源特性都为缺省值。同,样,我们也可用类似的方式定义光源的其他几个特性,值,例如,GLfloat light_ambient = 0.0, 0.0, 0.0, 1.0,GLfloat light_diffuse = 1.0, 1.0, 1.0, 1.0,GLflo
16、at light_specular = 1.0, 1.0, 1.0, 1.0,glLightfv(GL_LIGHT0, GL_AMBIENT,light_ambient,glLightfv(GL_LIGHT0, GL_DIFFUSE,light_diffuse,glLightfv(GL_LIGHT0, GL_SPECULAR,light_specular,第十章,OpenGL,光照,10.2.4,启动光照,在,OpenGL,中,必须明确指出光照是否有效或无,效。如果光照无效,则只是简单地将当前颜色映射到,当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感,如前几章例程运
17、行结,果显示。要使光照有效,首先得启动光照,即,glEnable(GL_LIGHTING,若使光照无效,则调用,gDisable(GL_LIGHTING,可关闭当前光照。然后,必须使所定义的每个光源有,效,例,light0.c,中只用了一个光源,即,glEnable(GL_LIGHT0,其它光源类似,只是光源号不同而已,第十章,OpenGL,光照,10.3,明暗处理,在计算机图形学中,光滑的曲面表面常用多边形,予以逼近和表示,而每个小多边形轮廓(或内部)就,用单一的颜色或许多不同的颜色来勾画(或填充,这种处理方式就称为,明暗处理,在,OpenGL,中,用单,一颜色处理的称为,平面明暗处理,Fl
18、at Shading,用许多不同颜色处理的称为,光滑明暗处理,Smooth,Shading,,也称为,Gourand,明暗处理,Gourand,Shading,。设置明暗处理模式的函数为,void glShadeModel(GLenum mode,函数参数为,GL_FLAT,或,GL_SMOOTH,分别表,示平面明暗处理和光滑明暗处理,第十章,OpenGL,光照,应用平面明暗处理模,式时,多边形内每个点的,法向一致,且颜色也一致,应用光滑明暗处理模式时,多边形所有点的法向是由,内插生成的,具有一定的,连续性,因此每个点的颜,色也相应内插,故呈现不,同色。这种模式下,插值,方法采用的是双线性插值
19、,法,如图,10-2,所示,第十章,OpenGL,光照,Gouraud,明暗处理通常算法为,先用多边形顶点的光强线性插值出当前扫描线与多边,形边交点处的光强,然后再用交点的光强线插值处扫,描线位于多边形内区段上每一象素处的光强值。图中,显示出一条扫描线与多边形相交,交线的端点是,A,点,和,B,点,P,点是扫描线上位于多边形内的任一点,多,边形三个顶点的光强分别为,I1,I2,和,I3,取,A,点的光强,Ia,为,I1,和,I2,的线性插值,B,点的光强,Ib,为,I1,和,I3,的线性,插值,P,点的光强,Ip,则为,Ia,和,Ib,的线性插值。采用,Gouraud,明暗处理不但可以使用多边
20、形表示的曲面光,强连续,而且计算量很小。这种算法还可以以增量的,形式改进,且能用硬件直接实现算法,从而广泛用于,计算机实时图形生成。请看下面光滑明暗处理的例程,第十章,OpenGL,光照,例,10-2,明暗处理例程,Shading.c,include glos.h,include,include,include,void myinit(void,void object(void,void CALLBACK display(void,void CALLBACK myReshape(GLsizei w,GLsizei h,第十章,OpenGL,光照,* GL_SMOOTH is actually
21、the default,shading model. *,void myinit (void,glShadeModel (GL_SMOOTH,第十章,OpenGL,光照,void object(void,glBegin (GL_POLYGON,glColor3f (1.0, 0.0, 0.0,glVertex2f (4.0, 4.0,glColor3f(1.0,1.0,1.0,glVertex2f (12.0, 4.0,glColor3f(0.0,0.0,1.0,glVertex2f (12.0, 12.0,glColor3f(0.0,1.0,0.0,glVertex2f (4.0, 12.0
22、,glEnd (,第十章,OpenGL,光照,void CALLBACK display(void,glClear (GL_COLOR_BUFFER_BIT,object (,glFlush (,第十章,OpenGL,光照,void CALLBACK myReshape(GLsizei w, GLsizei,h,glViewport(0, 0, w, h,glMatrixMode(GL_PROJECTION,glLoadIdentity(,if (w = h,gluOrtho2D (0.0, 16.0, 0.0, 16.0 * (GLfloat,h/(GLfloat) w,else,gluOr
23、tho2D (0.0, 16.0 * (GLfloat,w/(GLfloat) h, 0.0, 16.0,glMatrixMode(GL_MODELVIEW,第十章,OpenGL,光照,void main(void,auxInitDisplayMode (AUX_SINGLE ,AUX_RGBA,auxInitPosition (0, 0, 500, 500,auxInitWindow (Smooth Shading,myinit(,auxReshapeFunc (myReshape,auxMainLoop(display,第十章,OpenGL,光照,以上程序运行结果是在屏幕上显示一个色彩连续
24、变,化的三角形。这个程序是用的,RGBA,显示模式,若改用颜,色表模式,则颜色内插实际上是颜色表的内插,因此呈现,的颜色可能不连续。不妨自己试试,另外,若在,light0.c,程序中加上一句定义,GL_FLAT,明,暗处理模式,则又会出现怎样的情形呢?读者可以仔细比,较一下,第十章,OpenGL,光照,10.4,材质,10.4.1,材质颜色,OpenGL,用材料对光的红、绿、蓝三原色的反射率来,近似定义材料的颜色。象光源一样,材料颜色也分成,环境,漫反射和镜面反射成分,它们决定了材料对环境光、漫反,射光和镜面反射光的反射程度,在进行光照计算时,材料对环境光的反射率与每个进入光,源的环境光结合,
25、对漫反射光的反射率与每个进入光源的,漫反射光结合,对镜面光的反射率与每个进入光源的镜面,反射光结合。对,环境光与漫反射光的反射程度,决定了材料,的颜色,并且它们很相似。对,镜面反射光的反射率通常是,白色或灰色,即对镜面反射光中红、绿、蓝的反射率相,同,镜面反射高光最亮的地方将变成具有光源镜面光强度的颜,色。例如光亮的红色塑料球,球的大部分表现为红色,光,亮的高光将是白色的,第十章,OpenGL,光照,10.4.2,材质定义,材质的定义与光源的定义类似。其函数为,void glMaterialifv(GLenum face,GLenum,pname,TYPE param,定义光照计算中用到的当前
26、材质,face,可以是,GL_FRONT,GL_BACK,GL_FRONT_AND_BACK,它表明当前材质应该应用,到物体的哪一个面上,pname,说明一个特定的材质,param,是材质,的具体数值,若函数为向量形式,则,param,是一组值的指针,反之为,参数值本身。非向量形式仅用于设置,GL_SHINESS,pname,参数值,具体内容见表,10-1,另外,参数,GL_AMBIENT_AND_DIFFUSE,表示,可以用相同的,RGB,值设置环境光颜色和漫反射光颜色,第十章,OpenGL,光照,第十章,OpenGL,光照,例,10-3,材质定义例程,light1.c,include gl
27、os.h,include,include,void myinit(void,void CALLBACK myReshape(GLsizei w,GLsizei h,第十章,OpenGL,光照,void CALLBACK display(void); void myinit(void,设置材质的各种光的颜色成分反射比率,GLfloat mat_ambient=0.8,0.8,0.8,1.0,GLfloat mat_diffuse=0.8,0.0,0.8,1.0,紫色,GLfloat mat_specular = 1.0, 0.0, 1.0, 1.0,亮紫色,GLfloat mat_shinine
28、ss = 50.0,GLfloat light_position = 1.0, 1.0, 1.0, 0.0,第十章,OpenGL,光照,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRONT, GL_SHININESS,mat_shininess,glLightfv(GL_LIGHT0, GL_POSITION,light_pos
29、ition,glEnable(GL_LIGHTING,glEnable(GL_LIGHT0,glDepthFunc(GL_LESS,glEnable(GL_DEPTH_TEST,第十章,OpenGL,光照,void CALLBACK display(void,glClear(GL_COLOR_BUFFER_BIT ,GL_DEPTH_BUFFER_BIT,auxSolidSphere(1.0,glFlush(,第十章,OpenGL,光照,void CALLBACK myReshape(GLsizei w, GLsizei h,glViewport(0, 0, w, h,glMatrixMode
30、(GL_PROJECTION,glLoadIdentity(,if (w = h,glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0,else,glOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0,glMatrixMode(GL_MODELVIEW,glLoadIdentity(,第十章,OpenGL,光照,void main(void,auxInitDisp
31、layMode (AUX_SINGLE ,AUX_RGBA | AUX_DEPTH16,auxInitPosition (0, 0, 500, 500,auxInitWindow (Lighting_1,myinit(,auxReshapeFunc (myReshape,auxMainLoop(display,第十章,OpenGL,光照,以上程序运行结果是一个紫色的球。在函,数,myinit(,中定义了球的材质颜色,光源的定,义仍延用,light0.c,中的,而,light.c,物体的光源,定义为缺省形式。从例子中明显地看出,物体,的材质颜色定义与光源颜色定义几乎一样,物,体反射到眼中的颜色与
32、二者都有关系,具体关,系请看下一小节,第十章,OpenGL,光照,10.4.3,材质,RGB,值和光源,RGB,值的关系,材质的颜色与光源的颜色有些不同。对于光源,R,G,B,值等于,R,G,B,对其最大强度的百分比。若光源颜,色的,R,G,B,值都是,1.0,则是最强的白光;若值变为,0.5,颜色仍为白色,但强度为原来的一半,于是表现为灰色,若,R,G,1.0,B,0.0,则光源为黄色。对于材质,R,G,B,值为材质对光的,R,G,B,成分的反射率。比如,一,种材质的,R,1.0,G,0.5,B,0.0,则材质反射全部的,红色成分,一半的绿色成分,不反射蓝色成分。也就是说,若,OpenGL,
33、的光源颜色为,LR,LG,LB,,材质颜色为,MR,MG,MB,,那么,在忽略所有其他反射效果的,情况下,最终到达眼睛的光的颜色为,LR*MR,LG*MG,LB*MB,第十章,OpenGL,光照,同样,如果有两束光,相应的值分别为,R1,G1,B1,和,R2,G2,B2,,则,OpenGL,将,各个颜色成分相加,得到,R1+R2,G1+G2,B1+B2,,若任一成分的和值大于,1,超出了设,备所能显示的亮度)则约简到,1.0,下面一例程,就说明了二者之间的关系,第十章,OpenGL,光照,例,10-4,材质与光源的,RGB,关系例程,light2.c,include glos.h,includ
34、e,include,void myinit(void,void CALLBACK myReshape(GLsizei w,GLsizei h,void CALLBACK display(void,第十章,OpenGL,光照,void myinit(void,GLfloat mat_ambient= 0.8, 0.8, 0.8, 1.0,GLfloat mat_diffuse= 0.8, 0.0, 0.8, 1.0,紫色,GLfloat mat_specular = 1.0, 0.0, 1.0, 1.0,GLfloat mat_shininess = 50.0,GLfloat light_dif
35、fuse= 0.0, 0.0, 1.0, 1.0,蓝色,GLfloat light_position = 1.0, 1.0, 1.0, 0.0,第十章,OpenGL,光照,glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient,glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular,glMaterialfv(GL_FRONT, GL_SHININESS,mat_shininess,glLightfv(GL_LIGHT0,
36、GL_DIFFUSE, light_diffuse,glLightfv(GL_LIGHT0, GL_POSITION, light_position,glEnable(GL_LIGHTING,glEnable(GL_LIGHT0,glDepthFunc(GL_LESS,glEnable(GL_DEPTH_TEST,第十章,OpenGL,光照,void CALLBACK display(void,glClear(GL_COLOR_BUFFER_BIT ,GL_DEPTH_BUFFER_BIT,auxSolidSphere(1.0,glFlush(,第十章,OpenGL,光照,void CALLB
37、ACK myReshape(GLsizei w, GLsizei h,glViewport(0, 0, w, h,glMatrixMode(GL_PROJECTION,glLoadIdentity(,if (w = h,glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0,else,glOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0,glMatrixMode(
38、GL_MODELVIEW,glLoadIdentity(,第十章,OpenGL,光照,void main(void,auxInitDisplayMode (AUX_SINGLE ,AUX_RGBA | AUX_DEPTH16,auxInitPosition (0, 0, 500, 500,auxInitWindow (Lighting_2,myinit(,auxReshapeFunc (myReshape,auxMainLoop(display,第十章,OpenGL,光照,以上程序运行结果是一个,蓝色的球,其中高光部分,仍为上一例的亮紫色。从,上可看出,球漫反射光的,结果是,mat_diffu
39、se,与,light_diffuse,中的三个颜,色分量值相乘,即,0.0*1.0,0.0*1.0,0.8*1.0,1,0*1.0)=(0.0,0.0,0.8,1.0,所以球大部分呈现蓝色,第十章,OpenGL,光照,10.4.4,材质改变,在实际应用的许多情况下,不同的物体或,同一物体的不同部分都有可能设置不同的材质,OpenGL,函数库提供了两种方式实现这种要求,下面一例程采用的是设置矩阵堆栈来保存不同,物体的材质信息,第十章,OpenGL,光照,例,10-5,矩阵堆栈改变材质例程,chgmat1.c,include glos.h,include,include,include,void
40、myinit(void,void CALLBACK display(void,void CALLBACK myReshape(GLsizei w,GLsizei h,第十章,OpenGL,光照,初始化,z-buffer,光源和光照模型,在此不具体定,义材质,void myinit(void,GLfloat ambient = 0.0, 0.0, 0.0, 1.0,GLfloat diffuse = 1.0, 1.0, 1.0, 1.0,GLfloat specular = 1.0, 1.0, 1.0, 1.0,GLfloat position = 0.0, 3.0, 2.0, 0.0,GLfl
41、oat lmodel_ambient = 0.4, 0.4, 0.4,1.0,glEnable(GL_DEPTH_TEST,glDepthFunc(GL_LESS,第十章,OpenGL,光照,glLightfv(GL_LIGHT0, GL_AMBIENT,ambient,glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse,glLightfv(GL_LIGHT0, GL_POSITION,position,glEnable(GL_LIGHTING,glEnable(GL_LIGHT0,glClearColor(0.0, 0.1, 0.1, 0.0,第十章,OpenG
42、L,光照,void CALLBACK display(void,GLfloat no_mat = 0.0, 0.0, 0.0, 1.0,GLfloat mat_ambient = 0.7, 0.7, 0.7, 1.0,GLfloat mat_ambient_color = 0.8, 0.8, 0.2, 1.0,GLfloat mat_diffuse = 0.1, 0.5, 0.8, 1.0,GLfloat mat_specular = 1.0, 1.0, 1.0, 1.0,GLfloat no_shininess = 0.0,GLfloat low_shininess = 5.0,GLfloa
43、t high_shininess = 100.0,GLfloat mat_emission = 0.3, 0.2, 0.2, 0.0,glClear(GL_COLOR_BUFFER_BIT ,GL_DEPTH_BUFFER_BIT,第十章,OpenGL,光照,第一行第一列绘制的球仅有漫反射光而无环境光和镜面,光,glPushMatrix(,glTranslatef (-3.75, 3.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialf
44、v(GL_FRONT, GL_SPECULAR,no_mat,glMaterialfv(GL_FRONT, GL_SHININESS,no_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第一行第二列绘制的球有漫反射光和镜面光,并有低高,光,而无环境光,glPushMatrix(,glTranslatef (-1.25, 3.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat,glMaterialfv
45、(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRONT, GL_SHININESS,low_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第一行第三列绘制的球有漫反射光和镜面光,并有很亮,的高光,而无环境光,glPushMatrix(,glTranslatef (1.25, 3.0, 0.0,g
46、lMaterialfv(GL_FRONT, GL_AMBIENT, no_mat,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRONT, GL_SHININESS,high_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第一行第四列绘制的球有漫反射光和辐射光,而无环,境
47、和镜面反射光,glPushMatrix(,glTranslatef (3.75, 3.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,no_mat,glMaterialfv(GL_FRONT, GL_SHININESS,no_shininess,glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission,auxSolidSphere(1.0,glPo
48、pMatrix(,第十章,OpenGL,光照,第二行第一列绘制的球有漫反射光和环境光,而镜面,反射光,glPushMatrix(,glTranslatef (-3.75, 0.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,no_mat,glMaterialfv(GL_FRONT, GL_SHININESS,no_shininess,glMaterialfv(GL_FRONT,
49、 GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第二行第二列绘制的球有漫反射光、环境光和镜面光,且有低高光,glPushMatrix(,glTranslatef (-1.25, 0.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRO
50、NT, GL_SHININESS,low_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第二行第三列绘制的球有漫反射光、环境光和镜面光,且有很亮的高光,glPushMatrix(,glTranslatef (1.25, 0.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(
51、GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRONT, GL_SHININESS,high_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第二行第四列绘制的球有漫反射光、环境光和辐射,光,而无镜面光,glPushMatrix(,glTranslatef (3.75, 0.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient,glMat
52、erialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,no_mat,glMaterialfv(GL_FRONT, GL_SHININESS,no_shininess,glMaterialfv(GL_FRONT, GL_EMISSION,mat_emission,auxSolidSphere(1.0); glPopMatrix(,第十章,OpenGL,光照,第三行第一列绘制的球有漫反射光和有颜色的环境光,而无镜面光,glPushMatrix(,glTranslatef (-3.75, -3.0, 0
53、.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient_color,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,no_mat,glMaterialfv(GL_FRONT, GL_SHININESS,no_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第三行第二列绘制的球有漫反射光和有颜色
54、的环境光以,及镜面光,且有低高光,glPushMatrix(,glTranslatef (-1.25, -3.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient_color,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRONT, GL_SHININESS,low_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat
55、,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第三行第三列绘制的球有漫反射光和有颜色的环境光以,及镜面光,且有很亮的高光,glPushMatrix(,glTranslatef (1.25, -3.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient_color,glMaterialfv(GL_FRONT, GL_DIFFUSE,mat_diffuse,glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular,glMaterialfv(GL_FRONT, GL
56、_SHININESS,high_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, no_mat,auxSolidSphere(1.0,glPopMatrix(,第十章,OpenGL,光照,第三行第四列绘制的球有漫反射光和有颜色的环境光以及辐射,光,而无镜面光,glPushMatrix(,glTranslatef (3.75, -3.0, 0.0,glMaterialfv(GL_FRONT, GL_AMBIENT,mat_ambient_color,glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse,glMate
57、rialfv(GL_FRONT, GL_SPECULAR, no_mat,glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess,glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission,auxSolidSphere(1.0,glPopMatrix(,glFlush(,第十章,OpenGL,光照,void CALLBACK myReshape(GLsizei w, GLsizei h,glViewport(0, 0, w, h,glMatrixMode(GL_PROJECTION,glLoadIdentity(
58、,if (w = (h * 2,glOrtho (-6.0, 6.0, -3.0*(GLfloat)h*2)/(GLfloat)w,3.0*(GLfloat)h*2)/(GLfloat)w, -10.0, 10.0,else,glOrtho (-6.0*(GLfloat)w/(GLfloat)h*2,6.0*(GLfloat)w/(GLfloat)h*2), -3.0, 3.0, -10.0,10.0,glMatrixMode(GL_MODELVIEW,第十章,OpenGL,光照,void main(void,auxInitDisplayMode (AUX_SINGLE ,AUX_RGBA,a
59、uxInitPosition (0, 0, 600, 450,auxInitWindow (Material,myinit(,auxReshapeFunc (myReshape,auxMainLoop(display,第十章,OpenGL,光照,以上程序运行结果是绘,制,12,个球,3,行,4,列)。第一,行的球材质都没有环境反射,光,第二行的都有一定的环,境反射光,第三行的都有某,种颜色的环境光。而第一列,的球材质仅有蓝色的漫反射,光;第二列的不仅有蓝漫反,射光,而且还有镜面反射光,较低的高光;第三列的不仅,有蓝漫反射光,而且还有镜,面反射光,很亮的高光;第,四列的还包括辐射光,但无,镜面光,第十章,OpenGL,光照,这个程序运用矩阵堆栈多次调用,glMaterialfv(,来设置,每个球的材质,也就是改变同一场景中的不同物体的颜色,但由于这个函数的应用有个性能开销,因此建议最好尽可,能少的改变材质,以减少改变材质时所带来的性能开销,可采用另一种方式即改变材质颜色,相应函数为,glColorMaterial(,说明如下,void glColorMaterial(GLenum face,GLenum,mode,函数参数,face,指定面,值有,GL_FRONT,GL_BACK,或,GL_FRONT_AND_BACK,缺省值,mode,指定材质成分,值有,GL_AMBIE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小米公司成本领先战略的研究
- 硕士论文评语大全
- 行政管理专科毕业论文范文
- 研究生写作学术论文的选题类型
- 全工程硕士毕业论文附录格式-附录怎么写
- 建筑施工工程项目竣工验收法律风险及措施
- 毕业论文格式规定
- 华南师范大学自考汉语言文学教育专业
- 必背清单-2025-2026学年北师大版八年级上册生物
- 学科教学(数学)专业硕士研究生培养方案
- GB 6222-2025工业企业煤气安全规范
- 人教版八年级上册地理(课件)第三章 中国的自然资源第四节 海洋资源
- 2025智能快递柜网络布局优化与运营效率报告
- 四川省成都市第七中学2025-2026学年高三上学期11月半期考试语文(含答案)
- BIM工程师质量管理计划
- 2025年大学《水利水电工程-水工建筑物》考试模拟试题及答案解析
- DB11∕T 1355-2016 低温作业和冷水作业职业卫生技术规范
- 工会考试题库附答案2025年
- 江苏省常州市常州高级中学2026届化学高一第一学期期中统考试题含解析
- 元宇宙的运营方案
- 四川省凉山州西昌市2025-2026学年高一上学期期中学科素养监测数学试题(无答案)
评论
0/150
提交评论