《光线跟踪算法》PPT课件.ppt

上传人:wuy****n92 文档编号:69913858 上传时间:2023-01-11 格式:PPT 页数:38 大小:427KB
返回 下载 相关 举报
《光线跟踪算法》PPT课件.ppt_第1页
第1页 / 共38页
《光线跟踪算法》PPT课件.ppt_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《《光线跟踪算法》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《光线跟踪算法》PPT课件.ppt(38页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、光线跟踪算法主要内容:一、实验设计二、静止多光源实现三、材料属性对光照效果的影响四、移动光源的实现实验设计问题一、影响光照效果的因素?问题二、OPENGL光线跟踪函数的函数?问题三、光线跟踪实现的基本步骤?一、OPENGL中影响光照效果的因素?1、光源光的种类:环境光:light_ambient 散射光:light_diffuse 镜面光:light_specular光源的分类:方向性光源:无限远,所有光线是平行的位置性光源:位置决定场景中的效果区别:GLfloat light_position 中的第四个参数2、材料属性材料的环境颜色:GL_AMBIENT材料的散射颜色:GL_DIFFUSE

2、材料的镜面颜色:GL_SPECULAR 材料的镜面指数:GL_SHININESS材料的发射颜色:GL_EMISSION问题二、OPENGL光线跟踪函数的函数?光源:void glLightif(GLenum light,GLenum pname,TYPEparam);void glLightifv(GLenum light,GLenum pname,TYPE*param);Light:指定光源 pname:光源属性 param:属性值材料属性:void glMaterialif(GLenum face,GLenum pname,TYPEparam);void glMaterialifv(GLe

3、num face,GLenum pname,TYPE*param);Face:那个面受光照 pname:光源属性 param:属性值问题三、光线跟踪实现的基本步骤?一、创建光源二、选择光照模型三、定义材料属性有了这些知识,我们就可以进行第一个简单的多光源实验。静止多光源实现自己的工作:按照光线跟踪实现的步骤进行。设置光源参数,衰减因子,聚光灯参数,材料属性参数,调用glLightfv,glMaterialfv,glEnable等函数进行设置。已有的:实现静态光源显示void reshape(int w,int h)void display(void)创建光源1、设置光源参数方向性光源,环境光颜

4、色为蓝色GLfloat light_ambient=0.0,0.0,1.0,1.0;GLfloat light_diffuse=1.0,1.0,1.0,1.0;GLfloat light_specular=1.0,1.0,1.0,1.0;GLfloat light_position=1.0,1.0,1.0,0.0;位置性光源,环境光和散射光颜色为红色GLfloat light1_ambient=1.0,0.0,0.0,1.0;GLfloat light1_diffuse=1.0,0.0,0.0,1.0;GLfloat light1_specular=1.0,1.0,1.0,1.0;GLfloa

5、t light1_position=0.0,2.0,2.0,1.0;2、衰减因子定义衰减因子目的:增强真实效果glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0);glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.5);glLightf(GL_LIGHT1,GL_CONSTANT_ATTENUATION,1.5);glLightf(GL_LIGHT1,GL_LINEAR_ATTENUATION,0.5);glLightf

6、(GL_LIGHT1,GL_QUADRATIC_ATTENUATION,0.2);三个参数的默认值为1,0,03,聚光灯参数光源LIGHT1GLfloat spot_direction=1.0,-1.0,-1.0;glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,spot_direction);glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,45.0);/默认值180glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,5.0);/用于控制光的集中度,越高强度越集中4,glLightfv的调用 glLightfv(GL_LIGHT

7、0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT1,GL_AMBIENT,light1_ambient);glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse);glLightfv(GL_LIGHT1,GL_SPECULAR,ligh

8、t1_specular);glLightfv(GL_LIGHT1,GL_POSITION,light1_position);5,glEnable的调用作用:启用光源 glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_LIGHT1);6,光源保持静止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/

9、(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();首先确定视口和投影矩阵,接着在模型视图矩阵中加载单位矩阵,然后再设置光源。由于使用单位阵,乘模型视图矩阵之后原来制定的光源位置并没有发生变化。选择光照模型静态多光源实现过程中使用默认设置:即观察者位于无穷远且只有一面接受光照 glMater

10、ialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_FALSE);定义材料属性材料属性值设置GLfloat mat_specular=1.0,1.0,1.0,1.0;GLfloat mat_shininess=50.0;glMaterialfv的调用glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_F

11、RONT,GL_SHININESS,mat_shininess);display()函数void display(void)glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/清空缓冲区 glutSolidSphere(1.0,20,16);/画圆,半径为1.0 glFlush();/保证绘图命令被实际执行效果展示屏蔽位置性光源只有方向性光源屏蔽方向性光源只有位置性光源静止多光源材料属性对光照效果的影响遇到的问题:如何将不同的材料属性赋予不同的球体?如何将不同的材料属性赋予不同的球体?如何将不同的材料属性赋予不同的球体?猜测可以通过调用glTra

12、nslatef()来实现查阅发现:glPushMatrix();glTranslatef();glMaterialfv();glutSolidSphere();glPopMatrix();创建光源/环境光,散射光和镜面光参数GLfloat light_ambient=0.0,0.0,1.0,1.0;GLfloat light_diffuse=1.0,1.0,1.0,1.0;GLfloat light_specular=1.0,1.0,1.0,1.0;GLfloat light_position=1.0,1.0,1.0,0.0;/glLightfv的调用glLightfv(GL_LIGHT0,G

13、L_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);/glEnable的调用glEnable(GL_DEPTH_TEST);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);材料属性值设置 GLfloat no_mat=0.0,0.0,0.0,1.0;GLfloat mat_ambi

14、ent=0.7,0.7,0.7,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;GLfloat high_shininess=100.0;GLfloat mat_emission=0.3,0.2,0.2,0.0;glMaterialfv的调用 第一个球:只有散射颜色和发射颜色 glPushMatrix();glTranslatef(-1.0,-0.5,-2.0);glMaterialfv(

15、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);glutSolidSphere(1.0,16,16);/绘制小球 glPopMatrix();第二个球:只有散射颜色和镜面颜色,且镜面指数低 glPushMatrix();g

16、lTranslatef(0.0,-0.5,-3.0);glMaterialfv(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,low_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,no_mat);glutSolidSphere(1.0,16,16);glPopMatrix();第三个球:

17、只有散射颜色和镜面颜色,且镜面指数为高 glPushMatrix();glTranslatef(1.0,-0.5,-4.0);glMaterialfv(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);glutSolid

18、Sphere(1.0,16,16);glPopMatrix();静态光源控制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

19、,-1.5,1.5,-10.0,10.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();效果展示第一个小球只有散射颜色和发射颜色第二个小球只有散射颜色和镜面颜色,且镜面指数低 第三个小球只有散射颜色和镜面颜色,且镜面指数为高动态光源实现采用什么方式实现动态光源?通过点击鼠标产生鼠标事件,进而移动光源鼠标事件函数,目的通过点击鼠标控制旋转void mouse(int button,int state,int x,int y)switch(button)case GLUT_LEFT_BUTTON:if(state=GLUT_DOWN)spin=(spin

20、+30)%360;/全局变量spin的控制 glutPostRedisplay();break;default:break;void display3(void)/模型和视图变换 GLfloat position=0.0,0.0,1.5,1.0;glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glTranslatef(0.0,0.0,-5.0);glPushMatrix();glRotated(GLdouble)spin,1.0,0.0,0.0);/全局变量spin初值为0,通过鼠标事件改变它的值,进而进行旋转 g

21、lLightfv(GL_LIGHT0,GL_POSITION,position);glTranslated(0.0,0.0,1.5);glDisable(GL_LIGHTING);glColor3f(0.0,1.0,1.0);glutWireCube(0.1);/绘制立方体函数,目的是为了更好的显示效果 glEnable(GL_LIGHTING);glPopMatrix();glutSolidSphere(1.0,20,16);/绘制圆 glPopMatrix();glFlush();void reshape3(int w,int h)/投影和视口变换 glViewport(0,0,(GLsi

22、zei)w,(GLsizei)h);/作用调整绘图像素矩阵,使它占据整个窗口 glMatrixMode(GL_PROJECTION);/表示吧当前矩阵指定用于投影变换,后续的变换调用影响的是投影矩阵 glLoadIdentity();/对当前矩阵进行初始化 gluPerspective(40.0,(GLfloat)w/(GLfloat)h,1.0,20.0);/*void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble near,GLdouble far);创建一个表示对称透视视图凭借头体的矩阵,并把它与当前矩阵相乘 fovy yz平

23、面上视野的角度,它的值必须在0.0,180.0.aspect是这个平截头体的纵横比,即宽度除高度 near and far 观察点与近侧剪裁平面及远侧裁剪平面的距离,值为正数*/glMatrixMode(GL_MODELVIEW);/以后变换影响的是模型视图矩阵 glLoadIdentity();/对当前矩阵进行初始化效果展示光源在上面时光源在下侧时main()的实现int main(int argc,char*argv)/初始化 glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInit

24、WindowSize(500,500);/窗口大小 glutInitWindowPosition(100,100);/窗口位置 glutCreateWindow(argv0);/创建窗口 init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindo

25、w(argv0);init2();glutDisplayFunc(display2);glutReshapeFunc(reshape);glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutInitWindowPosition(100,100);glutCreateWindow(argv0);init3();glutDisplayFunc(display3);glutReshapeFunc(reshape3);glutMouseFunc(mouse);glutMainLoop();return 0;体会:OpenGL提供了一个很好图形应用程序接口,通过调用其中的函数库,我们可以达到事半功倍的效果!只有通过实习才能够更深刻的了解到每个函数的具体作用,才能够更好的运用。图形学实验做好了可以给你以美感,是一种享受。Thank youThank you!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com