opengl光照模型试验
图形学光照实验报告

glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
for(int i=-x;i<=x;i++)
{
mColor=Phong(x0,y0,r,i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
deltax += 2;
deltay += 4;
x++;
y--;
}
CirclePt( x0, y0, x, y, mColor);
}
}
//根据中点圆算法填充圆域
void FlatCircle(int x0, int y0, int r, Color mColor)
{
int x,y,deltax,deltay,d;
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);
OpenGL中的光照技术研究

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

北方工业大学计算机图形学课程实验报告题目:实验三光照模型学院:计算机学院专业:数字媒体技术指导教师:学生班级:学生学号:学生姓名:教师评定:学号:班级:姓名:实验报告3 光照模型一.实验目的1.熟悉OpenGL图形库;2.掌握光照模型算法。
二.实验环境1.软件环境:操作系统:WinXp应用软件:VC6.0,OpenGL2.硬件环境(查看自己的机子)CPU: Intel PIV 2.80GHz内存RAM: 1GB显卡:NVIDIA GeForce7650,256M显存三.实验内容1写程序实现一个聚光灯围绕立方体旋转程序。
要求给出RenderScene()函数。
void RenderScene (void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清楚颜色数据和深度数据(清屏)glColor3f(1.0,1.0,1.0);glLoadIdentity(); //初始变换矩阵为单位矩阵glTranslated(0,-1,-5); //平移0,0,-5向Z负方向平移5个单位glPushMatrix(); //压缩矩阵,设定光源的位置glDisable(GL_LIGHTING);glRotatef(yRot, 0, 1, 0); //光源的旋转glTranslatef(light_change[0],light_change[1],light_change[2]); //光源的位置glTranslatef(light_position[0], light_position[1],light_position[2]); //光源位置glutSolidSphere(0.1, 4,4);//利用库函数绘制一个半径为1的球体。
表示光源在这里glEnable(GL_LIGHTING);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glPopMatrix();light_direction[0] = -light_change[0];light_direction[1] = -light_change[1];light_direction[2] = -light_change[2];glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glPopMatrix(); //光源设置完毕glPushMatrix(); //压入变换矩阵那// glutSolidSphere(1, 30,30);//利用库函数绘制一个半径为1的球体。
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实验二

计算机学院12计算机科学与技术专业3班学号3112005883 姓名:曲绍霖教师评定:实验二光照模型的实现一、实验目的掌握OpenGL的光照及材质效果设置方法二、实验要求在Windows平台上用VC++结合GLUT做实验,要求掌握结合VC++和OpenGL的光照模型的理解及实现,实验完成后要求根据自己的成果撰写一份实验报告。
三、实验环境操作系统:Windows xp开发环境:VC++6.0以及GLUT图形交互设备:鼠标和键盘四、实验内容在实验一的基础上理解并实现添加各种光(环境光,发散光,镜面光,聚光),使效果更逼真以接近实际环境。
1、打开灯光,设置灯光的位置、方向、类别、颜色和衰减,并改变其值,观察效果的变化。
2、实现旋转和移动灯光。
3、设置材质,了解材质和光照如何相互影响。
五、存在的问题和感想在教科书的基础上增加光照的效果,难度不算太大,,在光照的效果中,用户可以编辑两种材质,经过光源的添加后,使得材质的形象更突出,用户可以自由移动光源位置达到想要的效果,这次实验也是对OpenGL学习加深了认识六、实现代码#include<windows.h>#include <stdlib.h>#include <GL/glew.h>#include <GL/glut.h>static int xRot=0;static int yRot=0;int iModel=1;void init(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 lmodel_ambient[]={0.4,0.4,0.4,1.0};GLfloat local_view[]={0.0};glClearColor(1.0,1.0,1.0,0.0);glEnable(GL_DEPTH_TEST);//这句是启用深度测试,这样,在后面的物体会被挡着glShadeModel(GL_SMOOTH);glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);//过很多次反射后最终遗留在环境中的光线强度(颜色)glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);//漫反射后最终遗留在环境中的光线强度(颜色)glLightfv(GL_LIGHT0,GL_SPECULAR, specular);//镜面反射后最终遗留在环境中的光线强度(颜色)glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);glEnable(GL_LIGHTING);//在后面的渲染中使用光照glEnable(GL_LIGHT0);//使用第0号光照}void myDisplay(void){//定义球体材质为翡翠GLfloat no_mat[]={0.0,0.0,0.0,1.0};GLfloat mat_ambient[]={0.0215,0.1745,0.0215,0.55};GLfloat mat_ambient_color[]={0.1215,0.2745,-0.5215,0.55};GLfloat mat_diffuse[]={0.07568,0.61424,0.07568,0.55};GLfloat mat_specular[]={0.633,0.727811,0.633,0.55};GLfloat no_shininess[]={0.0};GLfloat low_shininess[]={76.8};GLfloat high_shininess[]={12.8};GLfloat mat_emission[]={0.3,0.2,0.2,0.0};// 定义所在光源位置GLfloat position[]={0.0,0.0,1.5,1.0};glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);//设置可动光源位置glPushMatrix();glRotated((GLdouble)xRot,1.0,0.0,0.0);glRotated((GLdouble)yRot,0.0,1.0,0.0);glLightfv(GL_LIGHT0,GL_POSITION,position);glTranslated(0.0,0.0,1.5);glDisable(GL_LIGHTING);//绘制一个桔色球体表示光源位置glColor3f(1.0,0.8,0);glutWireSphere(0.07,8,8);glEnable(GL_LIGHTING);glPopMatrix();if(iModel==1){//球有环境光反射,漫反射,无镜面反射,发射光,低光泽度glPushMatrix();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,low_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);glutSolidSphere(1.0,64,64);glPopMatrix();}if(iModel==2){//球有环境光反射,漫反射,镜面反射,高光泽度glPushMatrix();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,high_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);glutSolidSphere(1.0,64,64);glPopMatrix();}glPopMatrix();glFlush();}//设窗口的坐标void reshape(int w,int h){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(40.0,(GLfloat)w/(GLfloat)h,1.0,20.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}//键盘控制void SpecialKeys(int key,int x,int y){ //上下左右键控制光照上下左右移动if(key==GLUT_KEY_UP) xRot=(xRot-10)%360;if(key==GLUT_KEY_DOWN) xRot=(xRot+10)%360;if(key==GLUT_KEY_RIGHT) yRot=(yRot+10)%360;if(key==GLUT_KEY_LEFT) yRot=(yRot-10)%360; glutPostRedisplay();}//设置刷新时间void TimerFunction(int value){glutPostRedisplay();glutTimerFunc(100,TimerFunction,1);}//菜单选项设置void Menu(int value){switch(value){case 1:iModel=1;break;case 2:iModel=2;break;}glutPostRedisplay();}int main(int argc, char *argv[]){int nMenu;glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(100, 100);glutInitWindowSize(720,640);// 设置窗口大小720*640glutCreateWindow("GLshape翡翠光照");//创建右键选择菜单nMenu=glutCreateMenu(Menu);glutAddMenuEntry("有环境光反射,漫反射,无镜面反射,发射光,低光泽度",1);glutAddMenuEntry("有环境光反射,漫反射,镜面反射,高光泽度",2);glutAttachMenu(GLUT_RIGHT_BUTTON);glutTimerFunc(100,TimerFunction,1);init();glutSpecialFunc(SpecialKeys);glutDisplayFunc(myDisplay);glutReshapeFunc(reshape);glutMainLoop();return 0;}七、运行结果:用键盘的上下左右来控制光源移动以看到有光反射出来的效果。
三维图形的光照、贴图及阴影处理(OpenGL)

三维图形的光照、贴图及阴影处理(OpenGL)实验过程:一、在VS6.0中建立新工程。
1、新建一个Win32 Application的工程。
2、向工程项目添加C++源文件。
3、将OpenGL框架复制到文件中。
4、设置OpenGL窗口标题。
二、场景设置。
1、视线处于一具有地板及前、左、右三面墙壁的空间中。
2、空间顶部中央有一光源。
3、空间中央有一地球仪,不断旋转。
三、建立视口结构及视点属性。
1、在坐标系上建立视图结构。
如图。
2、参数设置。
窗口大小:800*600。
视口大小:800*600。
透视深度:0.1~100。
透视角:60°。
视点位置:(0.0, 2.0, 15.0)。
视线方向:z轴负方向。
视点上方向:y轴正方向。
3、调用函数glViewport()、gluPerspective()和gluLookAt()实现。
四、绘制三维图形。
1、开启深度测试模式。
为防止图形重叠时出现层次混乱,必须对绘制图形进行消隐处理。
直接调用函数glEnable(GL_DEPTH_TEST)开启深度测试。
2、绘制地面与墙壁。
调用OpenGL基本几何元素绘制过程glBegin(GL_QUADS)、glBegin(GL_QUAD_STRIP)绘制四个平面,坐标范围为:x: -10~10, y: -2~20, z: -10~10。
坐标系结构如图。
3、绘制地球仪。
设计函数void DrawEarth()实现地球仪的绘制,分别调用OpenGL球面绘制函数gluSphere()绘制地球形状、柱面绘制函数gluCylinder()绘制地轴两头形状。
(1)参数设置。
球面半径:2。
球面细度:水平100,垂直100。
柱面半径:0.05。
柱面高度:1。
柱面细度:水平50,垂直1。
(2)结构如图。
4、绘制模拟光源。
(1)绘制“灯罩”。
调用glBegin(GL_TRIANGLE_STRIP)绘制4个三角形,构成棱椎形灯罩的4个侧面。
(2)绘制“灯泡”。
探究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中的光照模型

OpenGL中的光照模型一、OpenGL的光照模型在OpenGL的简单光照模型中反射光可以分成三个分量,环境反射光(Ambient Light)、漫反射光(Diffuse Light)和镜面反射光(Specular Light):a、环境光Ambient,是由光源发出经环境多次散射而无法确定其入射方向的光,即似乎来自所有方向。
当环境光照到曲面上时,它在各个方向上均等地发散(类似于无影灯光)。
特征:入射方向和出射方向均为任意方向。
b、漫射光Diffuse,来自特定方向,它垂直于物体时比倾斜时更明亮。
一旦它照射到物体上,则在各个方向上均匀地发散出去,效果为无论视点在哪里它都一样亮。
特征:入射方向唯一、出射方向为任意方向。
c、镜面光Specular,来自特定方向并沿另一方向反射出去,一个平行激光束在高质量的镜面上产生100%的镜面反射。
特征:入射方向和出射方向均唯一。
二、创建光源定义光源特性的函数:glLight*(light , pname, param)其中第一个参数light指定所创建的光源号,如GL_LIGHT0、GL_LIGHT1、...、GL_LIGHT7;第二个参数pname指定光源特性,这个参数的辅助信息见表1所示;最GL_LIGHT0,其他几个光源的GL_DIFFUSE和GL_SPECULAR缺省值为(0.0,0.0,0.0,1.0)。
三、启用光源和明暗处理如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算。
要启用光照或关闭光照,调用函数:glEnable(GL_LIGHTING) 或glDisable(GL_LIGHTING)。
启用光照后必须调用函数glEnable(GL_LIGHT0) ,使所定义的光源有效。
其它光源类似,只是光源号不同而已。
在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处理的称为光滑明暗处理(Smooth Shading),也称为Gourand明暗处理(Gourand Shading)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:姓名:协作者:实验二题目:光照模型的实现第十四周星期四实验二光照模型的实现一、实验目的掌握OpenGL的光照及材质效果设置方法二、实验要求在Windows平台上用VC++结合GLUT做实验,要求掌握结合VC++和OpenGL的光照模型的理解及实现,实验完成后要求根据自己的成果撰写一份实验报告。
三、实验环境操作系统:Windows xp开发环境:VC++6.0以及GLUT图形交互设备:鼠标和键盘四、实验内容在实验一的基础上理解并实现添加各种光(环境光,发散光,镜面光,聚光),使效果更逼真以接近实际环境。
1、打开灯光,设置灯光的位置、方向、类别、颜色和衰减,并改变其值,观察效果的变化。
2、实现旋转和移动灯光。
3、设置材质,了解材质和光照如何相互影响。
五、存在的问题和感想Opengl是一个强大的图形设计工具,对于设计具有真实感的图形真的很有帮助,在学习opengl的过程中,遇到了许多问题,比如,光照效果函数的使用,什么环境光,漫射光,反射光,一开始总搞不懂这些光找出来的具体效果是怎样的,还有对三维空间,视点坐标,模型坐标的变换等等,通过学习,参考别的代码,初步了解了这些函数调用的效果,也感觉到了opengl功能的强大,给人的视觉效果等等。
学习opengl真的是充满了无穷的乐趣啊!六、结果测试1、球体、单色渲染、光照2、单击右键弹出选择菜单,选择正方体、单色渲染和光照3、单击右键弹出选择菜单,选择棱锥,单色渲染和光照4、单击右键选择平滑渲染,上下左右键旋转光源附件:#include<Common\OpenGLSB.h> #include<Common\GLTools.h> GLfloat xRot=0.0f;GLfloat yRot=0.0f;GLfloat xRot1=0.0f;GLfloat yRot1=0.0f;GLfloat lightColor[]={1.0f,1.0f,1.0f}; GLfloat white[]={1.0f,1.0f,1.0f}; GLfloatspecular[]={1.0f,1.0f,1.0f,1.0f}; GLfloatlightPos[]={0.0f,50.0f,0.0f,1.0f}; GLfloatlightDir[]={0.0f,1.0f,0.0f,1.0f}; GLfloatspecref[]={1.0f,1.0f,1.0f,1.0f}; GLfloatambientLight[]={0.5f,0.5f,0.5f,1.0f}; char textrueObject[]={"png1.png"};int iShape=1;int iModel=1;void DrawGround(void);void DrawCube(void);void DrawTriangle(void);void RenderScene(void){glClear(GL_COLOR_BUFFER_BI T|GL_DEPTH_BUFFER_BIT);if(iModel==1)glShadeModel(GL_FLAT);if(iModel==2)glShadeModel(GL_SMOOTH); glPushMatrix();glRotatef(xRot,0.0f,1.0f,0.0f);glRotatef(yRot,1.0f,0.0f,0.0f);glDisable(GL_LIGHTING); glLightfv(GL_LIGHT0,GL_POSITI ON,lightPos);glLightfv(GL_LIGHT0,GL_SPOT_ DIRECTION,lightDir); glTranslatef(lightPos[0],lightPos[1], lightPos[2]);glColor3f(1.0f,0.0f,0.0f);//glutSolidCone(3.0f,4.0f,15,15);glColor3f(0.0f,1.0f,0.0f);glutSolidSphere(2.0f,30,30); glPopMatrix();glPushMatrix();glRotatef(xRot1,0.0f,1.0f,0.0f);glRotatef(yRot1,1.0f,0.0f,0.0f);glEnable(GL_LIGHTING);if(iShape==1){glColor3f(0.0f,1.0f,1.0f); glutSolidSphere(25.0f,30,30);}if(iShape==2){DrawCube();}if(iShape==3){DrawTriangle();}glPopMatrix();glPushMatrix();glDisable(GL_LIGHTING);glTranslatef(0.0f,-50.0f,0.0f);glColor3f(0.0f,1.0f,1.0f);DrawGround();glPopMatrix(); glutSwapBuffers();}void SetupRC(void){glEnable(GL_DEPTH_TEST); glEnable(GL_DITHER); glFrontFace(GL_CCW);glEnable(GL_TEXTURE_3D); glEnable(GL_LIGHTING);//光源属性glLightModelfv(GL_LIGHT_MOD EL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0,GL_DIFFU SE,ambientLight);glLightfv(GL_LIGHT0,GL_SPECU LAR,specular);glLightf(GL_LIGHT0,GL_SPOT_C UTOFF,120.0f);glLightfv(GL_LIGHT0,GL_SPECU LAR,white);glEnable(GL_LIGHT0);//设定材质属性glEnable(GL_COLOR_MATERIAL); glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); glMaterialfv(GL_FRONT,GL_AM BIENT_AND_DIFFUSE,white);glMaterialfv(GL_FRONT,GL_SPECULAR,specref);glMateriali(GL_FRONT,GL_SHININESS,128); glClearColor(0.0f,0.0f,0.0f,1.0f);}void ChangeSize(int w, int h){GLfloat fAspect;if(h == 0)h = 1;glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION);glLoadIdentity();fAspect = (GLfloat) w / (GLfloat) h;gluPerspective(35.0f, fAspect, 1.0f, 500.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0f, 0.0f, -250.0f); }//键盘控制void SpecialKeys(int key,int x,int y){ if(key==GLUT_KEY_UP)xRot+=5.0f;if(key==GLUT_KEY_DOWN)xRot-=5.0f;if(key==GLUT_KEY_RIGHT)yRot+=5.0f;if(key==GLUT_KEY_LEFT)yRot-=5.0f; glutPostRedisplay();} //画正方体void DrawCube(void){ glPushMatrix();glBegin(GL_QUADS); glBindTexture(GL_TEXTURE_2D, textrueObject[0]);glColor3ub(255,255,255); glVertex3f(25.0f,25.0f,25.0f);glColor3ub( 255,255,0); glVertex3f(25.0f,-25.0f,25.0f);glColor3ub(255,0,0); glVertex3f(-25.0f,-25.0f,25.0f);glColor3ub(255,0,255); glVertex3f(-25.0f,25.0f,25.0f);glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(25.0f,25.0f,-25.0f);glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(25.0f,-25.0f,-25.0f);glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-25.0f,-25.0f,-25.0f);glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-25.0f,25.0f,-25.0f);glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(25.0f,25.0f,-25.0f);glColor3f(1.0f, 1.0f, 1.0f);glVertex3f(25.0f,25.0f,25.0f);glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-25.0f,25.0f,25.0f);glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-25.0f,25.0f,-25.0f);glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(25.0f,-25.0f,-25.0f);glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(25.0f,-25.0f,25.0f);glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-25.0f,-25.0f,25.0f);glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-25.0f,-25.0f,-25.0f);glColor3f(1.0f, 1.0f, 1.0f); glVertex3f(25.0f,25.0f,25.0f);glColor3f(0.0f, 1.0f, 1.0f); glVertex3f(25.0f,25.0f,-25.0f);glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(25.0f,-25.0f,-25.0f);glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(25.0f,-25.0f,25.0f);glColor3f(1.0f, 0.0f, 1.0f); glVertex3f(-25.0f,25.0f,25.0f);glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-25.0f,25.0f,-25.0f);glColor3f(0.0f, 0.0f, 0.0f); glVertex3f(-25.0f,-25.0f,-25.0f);glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(-25.0f,-25.0f,25.0f);glEnd();glPopMatrix();}//画底面void DrawGround(void){GLfloat fExtent=100.0f;GLfloat fStep=10.0f;GLfloat y=-10.0f;GLint iLine;glPushMatrix();glBegin(GL_LINES);for(iLine=-fExtent;iLine<=fExtent;i Line+=fStep){glVertex3f(iLine,y,fExtent);glVertex3f(iLine,y,-fExtent);glVertex3f(fExtent,y,iLine);glVertex3f(-fExtent,y,iLine); }glEnd();glBegin(GL_QUADS);glColor3f(1.0f,1.0f,.0f); glVertex3f(-100.0f,-10.0f,-100.0f); glVertex3f(100.0f,-10.0f,-100.0f); glVertex3f(100.0f,100.0f,-100.0f);glVertex3f(-100.0f,100.0f,-100.0f); glEnd();glPopMatrix();}//画四棱锥void DrawTriangle(void){ glPushMatrix();glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,25.0f,0.0f); glVertex3f(-25.0f,-25.0f,25.0f); glVertex3f(25.0f,-25.0f,25.0f);glColor3f(0.0f,1.0f,1.0f);glVertex3f(0.0f,25.0f,0.0f); glVertex3f(25.0f,-25.0f,25.0f); glVertex3f(25.0f,-25.0f,-25.0f);glColor3f(1.0f,0.0f,1.0f);glVertex3f(0.0f,25.0f,0.0f); glVertex3f(25.0f,-25.0f,-25.0f); glVertex3f(-25.0f,-25.0f,-25.0f);glColor3f(1.0f,1.0f,.0f);glVertex3f(0.0f,25.0f,0.0f); glVertex3f(-25.0f,-25.0f,-25.0f); glVertex3f(-25.0f,-25.0f,25.0f);glEnd();glBegin(GL_QUADS); glVertex3f(25.0f,-25.0f,25.0f); glVertex3f(25.0f,-25.0f,-25.0f);glVertex3f(-25.0f,-25.0f,-25.0f);glColor3f(1.0f,1.0f,0.0f); glVertex3f(-25.0f,-25.0f,25.0f);glEnd();glPopMatrix();}void TimerFunction(int value){// yRot1+=5.0f;xRot1+=5.0f; glutPostRedisplay(); glutTimerFunc(100,TimerFunction, 1);}void Menu(int value){switch(value){case 1:iShape=1;break;case 2:iShape=2;break;case 3:iShape=3;break;case 4:iModel=1;break;case 5:iModel=2;break;}glutPostRedisplay();}int main(int argc,char* argv[]){int nMenu;//初始化窗口glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOU BLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600); glutCreateWindow("光照");//创建右键选择菜单nMenu=glutCreateMenu(Menu);glutAddMenuEntry("球体",1); glutAddMenuEntry("立方体",2); glutAddMenuEntry("圆锥体",3); glutAddMenuEntry("单色",4); glutAddMenuEntry("平滑",5); glutAttachMenu(GLUT_RIGHT_B UTTON);glutReshapeFunc(ChangeSize);glutSpecialFunc(SpecialKeys); glutTimerFunc(100,TimerFunction, 1);glutDisplayFunc(RenderScene); SetupRC();glutMainLoop();return 0;}。