实验7 OpenGL光照
OpenGL中的光照技术研究

OpenGL中的光照技术研究摘要:光照处理是增强图形真实感的重要组成部分,主要研究了如何在场景中添加OpenGL光照,介绍了添加光照的基本步骤以及实现方法,并对如何设置物体的材质属性作了简要介绍。
关键词:光照;真实感;OpenGL;材质0 引言当观察一个物体时,所看到的颜色是基于光子的分布而形成的,正是这些光子刺激了人眼圆锥细胞。
这些光子可能来自单个光源,也可能来自多个光源。
有些光子被表面所吸收,有些光子则被表面所反射。
不同的表面所具有的属性不同。
物体本身如果是用光滑的材质所组成,在此情况下就会反射更多的光,人的眼睛因此也将接受到更多的光子。
如果物体是由粗糙的材质所组成,更多的光子会被其吸收或者被反射出视野之外,因此眼睛就不会接受到很多的光子,物体就会比较暗。
用OpenGL在模拟光照时,通过将光近似地分解成红、绿和蓝色分量来计算光和光照。
也就是说,一个光的颜色由此光中的红、绿和蓝色分量的数量决定。
当光照射到一个表面时,OpenGL根据其表面的材质来确定此表面所应该反射的光的红、绿和蓝色分量的百分比数量。
1 OpenGL中光的类型(1)环境光。
环境光并不来自任何特定的方向。
它来自某个光源,但光线却是在房间或场景中四处反射,没有方向性可言。
由环境光所照射的物体在所有方向上的所有表面都是均匀照亮的。
(2)散射光。
散射光来自于一个特定的方向,但它均匀地在一个表面反射开来。
虽然光是均匀反射的,但受到光线直接指向的物体表面还是比其它从某个角度受到光线掠过的表面更亮一些。
(3)镜面光。
镜面光也是有方向的,但它的反射角度很锐利,是沿一个特定的方向。
高强度镜面光趋向于在它所照射的表面上形成一个亮点。
(4)发射光。
带有发射光的物体看起来就好像自身会发光,只不过这样的光不会对场景中的其它物体产生影响。
在OpenGL 中,发射光增加了物体的亮度,但是任何光源都不会影响发射光。
2 OpenGL中添加光照的步骤在OpenGL中添加光照需要遵循以下步骤:①为每个物体的每个顶点计算法向量,法线确定了物体相对于光源的指向;②创建、选择并定位所有的光源;③创建并选择一种光照模型;④为场景中的物体定义材质属性。
浅谈OpenGL中的光照技术

浅谈OpenGL中的光照技术下面的这边文章,让我对OpenGL中的光照有了新的认识OpenGL场景中模型颜色的产生,大致为如下的流程图所描述:(1)当不开启光照时,使用顶点颜色来产生整个表面的颜色。
用glShadeModel可以设置表面内部像素颜色产生的方式。
GL_FLAT/GL_SMOOTH.(2)一般而言,开启光照后,在场景中至少需要有一个光源(GL_LIGHT0.。
.GL_LIGHT7)通过glEnable(GL_LIGHT0)glDisable(GL_LIGHT0)来开启和关闭指定的光源。
--- 全局环境光---GLfloat gAmbient[]= {0.6,0,6,0,6,1.0};glLightModelfv(GL_LIGHT_MODEL_AMBIENT,gAmbient);(3)设置光源的光分量-- 环境光/漫色光/镜面光默认情况下,GL_LIGHT0.。
.GL_LIGHT7 的GL_AMBIENT值为(0.0,0.0,0.0,1.0); GL_LIGHT0的GL_DIFFUSE和GL_SPECULAR值为(1.0,1.0,1.0,1.0),GL_LIGHT1.。
.GL_LIGHT7 的GL_DIFFUSE和GL_SPECULAR值为(0.0,0.0,0.0,0.0)。
GLfloat lightAmbient[]= {1.0,1.0,1.0,1.0};GLfloat lightDiffuse[]= {1.0,1.0,1.0,1.0};GLfloat lightSpecular[]= {0.5,0.5,0.5,1.0};glLightfv(GL_LIGHT0,GL_AMBIENT,lightAmbient);glLightfv(GL_LIGHT0,GL_DIFFUSE,lightDiffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,lightSpecular);(4)设置光源的位置和方向-- 平行光-- 没有位置只有方向GLfloat lightPosiTIon[]= {8.5,5.0,-2.0,0.0}; // w=0.0。
opengl实验报告

opengl实验报告OpenGL实验报告引言:OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
OpenGL光照

简单光照模型
当光照射到一个物体表面上时,会出现三种情 形。
– 首先,光可以通过物体表面向空间反射,产生反射光。 – 其次,对于透明体,光可以穿透该物体并从另一端射
出,产生透射光。 – 最后,部分光将被物体表面吸收而转换成热。
在上述三部分光中,仅仅是透射光和反射光能够进入人 眼产生视觉效果。简单光照模型只考虑被照明物体表 面的反射光影响,假定物体表面光滑不透明且由理想 材料构成,环境假设为由白光照明。
glEnable(GL_LIGHTING);
若使光照无效,则调用gDisable(GL_LIGHTING)可 关闭当前光照。然后,必须使所定义的每个光源有效, 例中只用了一个光源,即:
glEnable(GL_LIGHT0);
其它光源类似,只是光源号不同而已。
• 材质颜色
材质
OpenGL中,材质的定义与光源的定义很相似,是通 过定义材料对红、绿、蓝三色光的反射率来近似定义材 料的颜色。象光源一样,材料颜色也分成环境、漫反射 和镜面反射成分,它们决定了材料对环境光、漫反射光 和镜面反射光的反射程度。
在进行光照计算时,材料对环境光的反射率与每个进 入光源的环境光结合,对漫反射光的反射率与每个进入 光源的漫反射光结合,对镜面光的反射率与每个进入光 源的镜面反射光结合。
对环境光与漫反射光的反射程度决定了材料的颜色, 并且它们很相似。对镜面反射光的反射率通常是白色或 灰色(即对镜面反射光中红、绿、蓝的反射率相同)。 镜面反射高光最亮的地方将变成具有光源镜面光强度的 颜色。例如一个光亮的红色塑料球,球的大部分表现为 红色,光亮的高光将是白色的。
OpenGL光组成
• 漫射光来自一个方向,它垂直于物体时比倾斜时 更明亮。一旦它照射到物体上,则在各个方向上 均匀地发散出去。于是,无论视点在哪里它都一 样亮。来自特定位置和特定方向的任何光,都可 能有散射成分。
第六讲_OpenGL编程技术-光照

6.6.1、光照模型 ◇ 介绍例程:ep_7_1_光照球
6.6.1、光照模型 ◇ OpenGL光组成 在OpenGL简单光照模型中的几种光分为:辐射光 (Emitted Light)、环境光(Ambient Light)、漫 射光(Diffuse Light)、镜面光(Specular Light)。 辐射光是最简单的一种光,它直接从物体发出并 且不受任何光源影响。 环境光是由光源发出经环境多次散射而无法确定 其方向的光,即似乎来自所有方向。一般说来,房间 里的环境光成分要多些,户外的相反要少得多,因为 大部分光按相同方向照射,而且在户外很少有其他物 体反射的光。当环境光照到曲面上时,它在各个方向 上均等地发散(类似于无影灯光)。
光学反射模型
通常物体表面的反射光可以认为包含三个分量:对环境光的 反射、对特定光源的漫反射和镜面反射。
(a) 漫反射
(b) 理想镜面反射
(c) 一般光滑表面的镜面反射
(d) 理想镜面反射方向 与视线方向的夹角
图6-6 光学反射模型
环境光的反射: 环境光(ambient light)来自周围环境(如墙面)散射的光,在 空间近似均匀分布,入射至物体表面后向空间各个方向均匀 反射出去。物体对环境光的反射分量表示: 其中Ia是入射的环境光亮度,Ka是环境光漫反射系数,它与物 体表面性质有关。如果简单光照模型中仅考虑环境光的反射分 量,则物体表面的亮度是一个恒定值,没有明暗的自然过渡。 散射(diffuse reflection): 散射分量表示特定光源在物体表面的反射光中那些向空间 各个方向均匀反射出去的光。兰伯特(Lambert)余弦定律指出: 当点光源照射到一个散射体时,其表面反射光亮度和光源入射 角(入射光线和表面法矢量的夹角)的余弦成正比,即 I K d I l cos( ) 0 0 Kd 1
opengl灯光

另外,在OpenGL中还可以设置聚光灯效果,这里我们就不讨论了。
光照处理
我们先看一下两个效果图,左边是没有光照的,右边是有光照的(不要认为有光照就亮,没有光照就黑哦,判别的依据应该是右图中出新了阴影,因此立体感也更强,如果觉得这个效果不好,可以自行调整个参数的)。
下面我们讨论具体的实现过程,同时阐述各个语句的作用:
1、添加几个全局变量:
下面这些变量用于控制光照开关的,我们通过按键L来控制光照开关。
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // 设置漫反射分量
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // 设置光源位置
Hale Waihona Puke glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Light_Model_Ambient);
此时的效果就正常了。
设置反射光:和环境光,漫反射光设置的方法类似,我们首先增加全局变量,它们分别表示光源的反射光分量和材质的反射光分量,它们共同决定了最终的颜色,现在我们将它设置成白色,可以起到反射很强的效果,你可以自己修改参数:
GLfloat LightSpecular[]= { 1.0f, 1.0f, 1.0f, 1.0f };
glMaterialfv(GL_FRONT,GL_SPECULAR,MaterialSpecular);//材质的反射分量
glMaterialf(GL_FRONT,GL_SHININESS,128);//后面的值越大,光线越集中
GL_SHININESS设置的值越大(最大也就128),光线越集中,但事实上我们并没有看到聚焦的效果,这是因为我们的图形分得不够细,我们如果改用一只轮胎(这个是glaux.h中提供的),就可以看清这个值的作用了。光照作用到整个场景中,以后随着场景的复杂度增加,光照的效果会更好。只要用这个代码代替绘制三棱锥和立方体代码就行了:
探究OpenGL光照模型的着色器实现

探究OpenGL光照模型的着色器实现探究OpenGL光照模型的着色器实现OpenGL的着色器是新一代显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。
OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader Model5,像我这样的初学者还需要花费更长的时间来学习才能基本了解OpenGL的着色器方面的知识。
下面两图展示了OpenGL从固定渲染管线到可编程渲染管线的变化从图中我们可以很容易地看出,OpenGL的顶点着色器取代了固定渲染管线的转换、光照、纹理坐标生成和转换;片断着色器取代了纹理、颜色求和和雾的操作。
在OpenGL3.2版本中加入了几何着色器(GeometryShader)这个概念,在OpenGL4.0中又添加了分格化控制(Tessellation Control)和分格化评估(Tessellation Evaluation)着色器,最新的OpenGL版本4.3则添加了计算着色器(Compute Shader)。
看来OpenGL的着色器真是越来越复杂,越来越重要了。
下面介绍一下光照模型在顶点着色器的实现,所有的内容都可以在《OpenGL超级宝典(第四版)》中找到。
漫反射光照是一种简单的光照模型,它只考虑漫反射。
它的公式是:N是顶点的单位法线,L是表示从顶点到光源的单位向量方向。
C mat 是表面材料的颜色,C li 是光线的颜色,C diff 是最终的散射颜色。
注意,N和L在传入之前一定要单位化。
如果用顶点着色器来实现的话,则是:uniform vec3 lightPos[1];void main( void ){// 法线的MVP变换gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;vec3 N = normalize( gl_NormalMatrix * gl_Normal );vec4 V = gl_ModelViewMatrix * gl_Vertex;vec3 L = normalize( lightPos[0] - V.xyz );// 输出散射颜色float NdotL = dot( N, L );gl_FrontColor = gl_Color * vec4( max( 0.0, NdotL ) );}注意,这里lightPos是一个标记为uniform的变量,这意味着可以在运行期传入的一个值到lightPos中来改变着色器的行为。
实验七 OpenGL光照效果

1.实验七OpenGL光照效果(选做)1.实验七:OpenGL光照效果。
2.实验目的:通过上机编程,熟悉并掌握OpenGL中光照效果的制造方法。
3.实验要求:(1)先做实验项目:实验六“OpenGL组合图形”。
(2)每人一组,独立完成。
(3)利用OpenGL提供的颜色、光源、材质设置,对实验六“OpenGL组合图形”中自己设计的物体设置绘制颜色和材质参数,并在场景中添加光源,形成一定的光照明暗效果。
4.实验原理及内容:在现实世界中,光线和物体的材质共同决定了物体在人眼中的效果。
OpenGL 中则涉及到绘制颜色、物体的材质参数、场景中的光源颜色和位置,以此达到一定的真实感光照效果。
(1)颜色:OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red, green, blue[, alpha]);glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。
在该函数之后绘制的所有物体都将使用该颜色。
(2)光线:OpenGL的光照模型中将光源分成四种:发射光:一个物体本身就是一个发光源,如太阳、电灯等,这种光不受其它任何光源的影响。
环境光:从光源出发后光线被环境多次反射,以致没有明确的方向,或者说来自于所有的方向。
被环境光照射的物体,各个表面都均等受光。
散射光:来自于某个方向,被物体表面均匀地反射,例如荧光照明、窗口射入的阳光等。
镜面光:来自于一个方向,被物体强烈地反射到另一个特定的方向。
高亮度的镜面光往往能在被照射的物体表面产生亮斑,如金属球上的高光区。
对于散射光和镜面光,入射角度、距离和衰减因子还会影响到最终的光照效果。
除了物体本身的发射光以外,通常意义上的光并不会是单纯的环境光、散射光或镜面光,而是由这三种类型的光混合组成的。
在OpenGL中,光也是采用RGBA值来定义的,分别描述光线中红绿蓝各成分的相对亮度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验7 OpenGL光照一、实验目的了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果。
二、实验内容(1)下载并运行Nate Robin教学程序包中的lightmaterial 程序,试验不同的光照与材质系数;(2)运行示范代码1,了解光照与材质函数使用。
三、实验原理为在场景中增加光照,需要执行以下步骤:(1)设置一个或多个光源,设定它的有关属性;(2)选择一种光照模型;(3)设置物体的材料属性。
具体见教材第8章8.6节用OpenGL生成真实感图形的相关内容。
四、实验代码#include<GL/glut.h>#include<stdlib.h>static int year =0,day=0;void init(void){GLfloat mat_specular[]={1.0,1.0,1.0,1.0};GLfloat mat_shininess[]={50.0};GLfloat light_position[]={1.0,1.0,1.0,0.0};GLfloat white_light[]={1.0,1.0,1.0,1.0};GLfloat Light_Model_Ambient[]={0.2,0.2,0.2,1.0};glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);//glMaterialfv(材质指定,单值材质参数,具体指针);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射光的反射系数glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//镜面反射指数//glLightfv(光源,属性名,属性值);glLightfv(GL_LIGHT0, GL_POSITION, light_position); //光源位置glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); //漫放射光分量强度glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); //折射光强度glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient);//光源2 GL_LIGHT1GLfloat mat_specular1[]={1.0,1.0,1.0,1.0};GLfloat mat_shininess1[]={50.0};GLfloat light_position1[]={0.0,0.0,0.0,0.0};GLfloat red_light[]={1.0,0.0,0.0,1.0};GLfloat Light_Model_Ambient1[]={0.2,0.2,0.2,1.0};glLightfv(GL_LIGHT1, GL_POSITION, light_position1); //光源位置glLightfv(GL_LIGHT1, GL_DIFFUSE, red_light); //漫放射光分量强度glLightfv(GL_LIGHT1, GL_SPECULAR, red_light); //折射光强度glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient1);//开启灯光glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);glEnable(GL_DEPTH_TEST);}void display(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();// 定义太阳的材质并绘制太阳{GLfloat sun_mat_ambient[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的环境光颜色,偏红色GLfloat sun_mat_diffuse[] = {0.5f, 0.5f, 0.0f, 1.0f}; //定义材质的漫反射光颜色,偏红色GLfloat sun_mat_specular[] = {1.0f,0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色GLfloat sun_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0GLfloat sun_mat_shininess = 32.0f;glMaterialfv(GL_FRONT,GL_AMBIENT,sun_mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,sun_mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,sun_mat_specular);glMaterialfv(GL_FRONT,GL_EMISSION,sun_mat_emission);glMaterialf (GL_FRONT,GL_SHININESS,sun_mat_shininess);glutSolidSphere(0.5,40,16);//太阳glRotatef((GLfloat) year,0.0,1.0,0.0);}glPushMatrix();{GLfloat earth_mat_ambient[] = {0.0f, 0.0f, 1.0f, 1.0f}; //定义材质的环境光颜色,偏蓝色GLfloat earth_mat_diffuse[] = {0.0f, 0.0f, 0.5f, 1.0f}; //定义材质的漫反射光颜色,偏蓝色GLfloat earth_mat_specular[] = {1.0f, 0.0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0GLfloat earth_mat_shininess = 30.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);glTranslatef(0.8,0.0,0.0);glRotatef((GLfloat) day,0.0,1.0,0.5);//位置变化glutSolidSphere(0.2,20,8);//地球{GLfloat earth_mat_ambient[] = {0.0f, 1.0f, 0.0f, 1.0f}; //定义材质的环境光颜色,偏绿色GLfloat earth_mat_diffuse[] = {0.0f, 0.5f, 0.0f, 1.0f}; //定义材质的漫反射光颜色,偏绿色GLfloat earth_mat_specular[] = {1.0f, .0f, 0.0f, 1.0f}; //定义材质的镜面反射光颜色,红色GLfloat earth_mat_emission[] = {0.0f, 0.0f, 0.0f, 1.0f}; //定义材质的辐射光颜色,为0GLfloat earth_mat_shininess = 30.0f;glMaterialfv(GL_FRONT, GL_AMBIENT, earth_mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, earth_mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, earth_mat_specular);glMaterialfv(GL_FRONT, GL_EMISSION, earth_mat_emission);glMaterialf (GL_FRONT, GL_SHININESS, earth_mat_shininess);glTranslatef(0.4,0.0,0.0);glRotatef((GLfloat) day,0.0,1.0,0.0);glutSolidSphere(0.1,20,8);//月亮}}glPopMatrix();glPopMatrix();glutSwapBuffers();glFlush();}void reshape(int w,int h){glViewport(0,0,(GLsizei) w,(GLsizei) 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(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);}void keyboard(unsigned char key, int x,int y){switch (key){case 'd':day=(day+10)%360;glutPostRedisplay();break;case 'D':day=(day-10)%360;glutPostRedisplay();break;case 'y':year=(year + 5)%360;glutPostRedisplay();break;case 'Y':year=(year-5)%360;glutPostRedisplay();break;case 27:exit(0);break;default:break;}}int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;}五、实验结果以下是实验结果截图:六、实验分析实验中,两个主要函数,glMaterialfv(材质指定,单值材质参数,具体指针),设置图形材质,glLightfv(光源,属性名,属性值),用来设置光源。