实验七 光照和材质.docx
- 文档编号:10196333
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:18
- 大小:190.25KB
实验七 光照和材质.docx
《实验七 光照和材质.docx》由会员分享,可在线阅读,更多相关《实验七 光照和材质.docx(18页珍藏版)》请在冰豆网上搜索。
实验七光照和材质
实验八光照和材质
一、实验目的
1、进一步掌握3D编程概念:
2、了解和掌握三维场景中如何设置光照和材质效果
二、实验内容
1.上机运行以下程序,并修改光照和材质的参数,观察对场景生成的影响。
#include
voiddisplay(void);
voidreshape(int,int);
voidlighting(void);
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitWindowSize(400,400);
glutInitWindowPosition(0,0);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA|GLUT_DEPTH);
glutCreateWindow("Planet");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
}
voidlighting(void)
{
GLfloatmat_diffuse[]={1.0,0.0,0.0,1.0};
GLfloatmat_specular[]={0.0,0.0,1.0,1.0};
GLfloatmat_ambient[]={0.0,1.0,0.0,1.0};
GLfloatmat_shininess[]={50.0};
GLfloatlight_specular[]={1.0,1.0,1.0,1.0};
GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};
GLfloatlight_ambient[]={0.0,0.0,0.0,1.0};
GLfloatlight_position[]={5.0,5.0,10.0,0.0};
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
//zbufferenable
glEnable(GL_DEPTH_TEST);
//enablelighting
glEnable(GL_LIGHTING);
//setlightproperty
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);
//setmaterialproperty
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);
glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
}
voiddisplay(void)
{
lighting();
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glutSolidSphere(0.8,128,128);
glFlush();
}
voidreshape(intw,inth)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0,1.0,-1.0,1.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
2.3D旋转世界的光照和材质设置(选作)
附属程序rotatingtorus-withlight&material.cpp为一视点保持不变的3D旋转程序,3D场景为一个圆环、一个小球和一个以四边形为基本单位的方块墙包围盒,且小球和圆环在“方块墙”的包围盒中。
视点设在正前方观察物体,小球绕着环心某处不停旋转,并和圆环一起绕着环心不停旋转。
并且场景实现了光照和材质效果,将程序仔细研读,运行查看光照效果,了解OpenGL光照材质程序代码编写。
图1带光照和材质效果的3D场景
1.回答下列问题,程序用到几个光源?
光源的性质?
光源的位置相对于物体位置如何?
2.改变光源参数,如光源的位置、光的三个分量强度、光源的数量等参数,光照效果受到什么影响?
3.改变材质参数,材质分量、材质系数等,光照效果又会受到什么影响?
4.将3D圆环物体替换为一个立方体,一个茶壶或其他3D物体查看效果。
1.)小球的光照和材质设置
附录中Material.cpp程序为场景光照不变,小球的材质不同,小球的显示效果各不相同,运行查看光照效果结果。
修改程序,修改小球材质参数,观看效果。
改变小球材质的参数,光照效果受到什么影响?
记录和保存原始效果图及其参数和各种参数修改后的效果截图和具体光照参数,看能否得出一些结论。
图2材质小球图3光照材质小球
另一个程序lightsphere.cpp只绘制了一个小球,包括有灯光和材质的设置,也可参考
2.)光源位置控制程序
运行附录程序lightcontrol.cpp,鼠标单击后,小球(即光源)位置会发生变化,从而光照效果发生变化。
了解光照位置对光照效果的影响。
a)位置1b)位置2c)位置3
图4光照位置控制程序效果
三、函数参考
1)光照设置函数
voidglLight{if}(GLenumlight,GLenumpname,TYPEparamvalue);voidglLight{if}v(GLenumlight,GLenumpname,TYPEparamvalue);
light:
光源名称,可以是GL_LIGHT0,GL_LIGHT1,…GL_LIGHTi,OpenGL至少支持8种独立光源
pname:
光源属性,如颜色、位置和方向等
paramvalue:
pname参数的值
Valuename
meaning
Defaultvalue
GL_AMBIENT
环境光分量强度
(0.0,0.0,0.0,1.0)
GL_DIFFUSE
漫反射光分量强度
(1.0,1.0,1.0,1.0)
GL_SPECULAR
镜面光分量的强度
(1.0,1.0,1.0,1.0)
GL_POSITION
光源的位置
(0.0,0.0,1.0,0.0)
GL_SPOT_DIRECTION
聚光方向
(0.0,0.0,-1.0)
GL_SPOT_EXPONENT
聚光指数
0.0
GL_SPOT_CUTOFF
聚光的截止角
180.0
GL_CONSTANT_ATTENUATION
常数衰减因子
1.0
GL_LINEAER_ATTENUATION
线性衰减因子
0.0
GL_QUADRATIC_ATTENUATION
二次衰减因子
0.0
2)材质定义函数
voidglMaterial{if}(GLenumface,GLenumpname,TYPEparam);
voidglMaterial{if}v(GLenumface,GLenumpname,TYPEparam);
指定光照计算中的物体材质属性
face:
GL_FRONT,GL_BACK,GL_FRONT_AND_BACK
例多边形有正反面,每个面都可能有相同或不同的属性
param:
face的参数,指其漫反射、镜面反射和环境光反射的颜色特性,参数为4维,第4个分量设为1,假定物体为不透明物体
pname
default
meaning
GL_AMBIENT
(0.2,0.2,0.2,1.0)
材质的环境光颜色
GL_DIFFUSE
(0.8,0.8,0.8,1.0)
材质的漫反射光颜色
GL_AMBIENT_DIFFUSE
材质的环境光和漫反射光颜色
GL_SPECULAR
(0.0,0.0,0.0,1.0)
材质的镜面反射光颜色
GL_SHINENESS
0.0
镜面反射指数
GL_EMISSION
(0.0,0.0,0.0,1.0)
材质的辐射光颜色
GL_COLOR_INDEXS
(0,1,1)
材质的环境光、漫反射光和镜面反射光颜色的索引
3)材质颜色相符函数
glColorMaterial(GLenumface,GLenummode);
允许材质的颜色跟踪glColor设置的颜色
face:
指定材质属性的表面,同前。
mode:
指哪种材质属性要更新与glColor设置的颜色保持一致,取值:
GL_AMBIENT、GL_DIFFUSE、GL_AMBIENT_AND_DIFFUSE、GL_SPECULAR或GL_EMISSION
调用glColorMaterial()之前,还必须启用该功能,例如:
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glColor3f(0.2,0.5,0.8);
drawtriangle();
glDisable(GL_COLOR_MATERIAL);
四、附属程序
1.rotatingtorus-withlight&material.cpp
#include
#include
#definePI3.14159
floattheta=-90.0;//圆环旋转角
floatangle=10;//左右场景每次旋转角
floatsightangle=-90;
floats=10;//前后直走步长
floatR=100;
intinner=10,outer=80;
floateyex=0,eyey=0,eyez=outer+4*inner+50;//初始视点位置
floatatx=0,aty=0,atz=0;//初始目标点位置
floatatx1,atz1,eyex1,eyez1;
floattt=0,tt2=0;
//voidspecialkeyboard(intkey,intx,inty);
voidmykeyboard(unsignedcharkey,intx,inty);
voidDisplay(void);
voidReshape(intw,inth);
voidmyidle();
voiddrawground();
voiddrawsphere();
voiddrawwall();
voidinit();
/*
//LightandmaterialData
GLfloatfLightPos[4]={-100.0f,100.0f,50.0f,1.0f};//Pointsource
GLfloatfNoLight[]={0.0f,0.0f,0.0f,0.0f};
GLfloatfLowLight[]={0.25f,0.25f,0.25f,1.0f};
GLfloatfBrightLight[]={1.0f,1.0f,1.0f,1.0f};
*/
intmain(intargc,char**argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowPosition(0,0);
glutInitWindowSize(1000,760);
//glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutCreateWindow("ARotatingTorus");
init();
glutDisplayFunc(Display);
glutKeyboardFunc(mykeyboard);
glutReshapeFunc(Reshape);
glutIdleFunc(myidle);
glutMainLoop();
return0;
}
voidinit()
{
glClearColor(1,1,1,1);
//definelightposition1
GLfloatlight_position1[]={-outer,outer,outer+4*inner+50,0.0};
//GLfloatlight_position1[]={0,0,0,0.0};
GLfloatlight_position2[]={+outer,-outer,outer+inner,0.0};
//GLfloatlightcolor1
GLfloatlight_ambient1[]={1.0,1.0,1.0,1.0};
GLfloatlight_diffuse1[]={1.0,1.0,1.0,1.0};
GLfloatlight_specular1[]={1.0,1.0,1.0,1.0};
//GLfloatlightcolor2
GLfloatlight_ambient2[]={0.8,0.8,0.8,1.0};
GLfloatlight_diffuse2[]={0.8,0.8,0.8,1.0};
GLfloatlight_specular2[]={0.8,0.8,0.8,1.0};
//lightmodel-globallight
GLfloatlmodel_ambient[]={0.8,0.2,0.2,1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);
//setlightsourcelocation
glLightfv(GL_LIGHT0,GL_POSITION,light_position1);
glLightfv(GL_LIGHT1,GL_POSITION,light_position2);
//setlightsourcecolor;
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient1);
glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse1);
glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular1);
//setlightsourcecolor;
glLightfv(GL_LIGHT1,GL_AMBIENT,light_ambient2);
glLightfv(GL_LIGHT1,GL_DIFFUSE,light_diffuse2);
glLightfv(GL_LIGHT1,GL_SPECULAR,light_specular2);
//setmaterialletmaterialfitscolor
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
//makelightsourceenable;
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
//clearcolor
//glClearColor(0.0,0.0,0.0,0.0);
//Colorshademode
glShadeModel(GL_SMOOTH);
//glShadeModel(GL_FLAT);
//polygonmode
glPolygonMode(GL_FRONT,GL_FILL);
GLfloatmat_specular1[]={1.0,1.0,1.0,1.0};
GLfloatmat_shininess1[]={80.0};
glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular1);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess1);
//depthdetecting
glEnable(GL_DEPTH_TEST);
}
voidDisplay(void)
{
//glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyex,eyey,eyez,atx,aty,atz,0,1,0);
glColor3f(0.0,0.0,1.0);
drawwall();
glColor3f(1.0,0,0);
drawground();
drawsphere();
glutSwapBuffers();
//glFlush();
}
voiddrawsphere()
{
floattr;
tr=(outer+3*inner);
glRotatef(theta,0,1,0);
glPushMatrix();
glPushMatrix();
glColor3f(1.0,0,0.0);
glutSolidTorus(inner,outer,50,80);
glPopMatrix();
glPushMatrix();
glTranslatef(outer,0,0);
glRotatef(theta,0,1,0);
glTranslatef(-outer,0,0);
glPushMatrix();
glTranslatef(tr,0,0);
glRotatef(-45,1,0,0);
glColor3f(0.0,1.0,0);
glutSolidSphere(inner,40,40);
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
voiddrawground()
{
intcolorflag=1;
glNormal3f(0,1,0);
for(inti=-outer-4*inner;i { /* if(colorflag>0)glColor3f(1.0,1.0,0.0); elseglColor3f(1.0,1.0,1.0); */ colorflag=-colorflag; glColor3f(1.0,1.0,1.0); for(intj=-outer-4*inner;j { if(colorflag>0)glColor3f(1.0,1.0,0.0); elseglColor3f(1.0,1.0,1.0); colorflag=-colorflag; glBegin(GL_QUADS); glVertex3d(j,-outer-4*inner,i); glVertex3d(j,-outer-4*inner,i+2*inner); glVertex3d(j+2*inner,-outer-4*inner,i+2*inner); glVertex3d(j+2*inner,-outer-4*inner,i); glEnd(); } } glNormal3f(0,-1,0); colorflag=1; for(intii=-outer-4*inner;ii { if(colorflag>0)glColor3f(1.0,1.0,0.0); elseglColor3f(1.0,1.0,1.0); colorflag=-colorflag; for(intj=-outer-4*inner;j { if(colorflag>0)glColor3f(1.0,1.0,0.0); elseglColor3f(1.0,1.0,1.0); colorflag=-colorflag; glBegin(GL_QUADS); glVertex3d(j,outer+4*inner,ii); glVertex3d(j,outer+4*inner,ii+2*inner); glVertex3d(j+2*inner,outer+4*inner,ii+2*inner); glVertex3d(j+2*inner,outer+4*inner,ii); glEnd();} } } voiddrawwall() { inti,j; glNormal3f(1,0,0); intcolorflag=1; //left for(i=-outer-4*inner;i { if(colorflag>0)glColor3f(1.0,1.0,0.0); elseglColor3f(1.0,1.0,1.0); colorflag=-color
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验七 光照和材质 实验 光照 材质
![提示](https://static.bdocx.com/images/bang_tan.gif)