课程实验指导6-光照_第1页
课程实验指导6-光照_第2页
课程实验指导6-光照_第3页
课程实验指导6-光照_第4页
课程实验指导6-光照_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程实验指导六 实验 6 简单光照明模型实现 1 实验目的 了解简单光照明模型的基本原理 利用 VC OpenGL 实现物体的真实感图形 2 实验内容 1 结合示范代码了解简单光照明模型的基本原理与实现 2 调试 编译 修改示范程序 给出不同光照系数 观察验证显示效果 3 尝试实现三角形的光照效果 3 实验原理 Phong 光照明模型是由物体表面上一点 P 反射到视点的光强 I 为环境光的反射光强 Ie 理想 漫反射光强 Id 和镜面反射光 Is的总和 即 8 10 n spdpaa VRKINLKIkII 其中 R V N 为单位矢量 Ip为点光源发出的入射光强 Ia为环境光的漫反射光强 Ka环 境光的漫反射系数 Kd漫反射系数 取决于表面的材料 Ks镜面反射系数 10 d K n 幂次 用以模拟反射光的空间分布 表面越光滑 n 越大 10 s K 在用 Phong 模型进行真实感图形计算时 对物体表面上的每个点 P 均需计算光线的反射 方向 R 再由 V 计算 为减少计算量 我们可以作如下假设 a 光源在无穷远处 即 VR 光线方向 L 为常数 b 视点在无穷远处 即视线方向 V 为常数 c 用近似 VH VR 这里 H 为 L 和 V 的角平分向量 在这种简化下 由于对所有的点总共只需计 VL VL H 算一次 H 的值 节省了计算时间 结合 RGB 颜色模型 Phong 光照明模型最终有如下的形 式 n sbpbdbpbababb n sgpgdgpgagagg n srprdrprararr NHKINLKIKII NHKINLKIKII NHKINLKIKII 本次实验中 光源在无穷远处 光线方向为单位向量 L 0 5 0 5 0 707 视点在无穷远处 视线方向 V 为 0 0 1 本次实验中增加了鼠标右键操作 相关知识见后面所附 GLUT 菜单知识 4 实验代码 Light cpp Defines the entry point for the console application include stdafx h include include include include define NO LIGHT 1 define LIGHT 2 bool bLight false struct Vector float fx fy fz struct Color float Ir Ig Ib float KaIa float Kd n Vector H light Color mLight mColor void Init float mo Vector eye mLight Ir 0 mLight Ig 175 mLight Ib 0 KaIa 100 Kd 0 7 n 20 light fx 0 50 light fy 0 50 light fz sqrt 1 light fx light fx light fy light fy eye fx 0 eye fy 0 eye fz 1 H fx light fx eye fx H fy light fy eye fy H fz light fz eye fz mo sqrt H fx H fx H fy H fy H fz H fz H fx H fx mo H fy H fy mo H fz H fz mo H fx H fx mo H fy H fy mo H fz H fz mo glClearColor 1 0 1 0 1 0 0 0 glShadeModel GL SMOOTH Color Phong int x0 int y0 int r int x int y Vector N float z alpha theta Ks Ks 1 0 Kd z sqrt float r r x x0 x x0 y y0 y y0 N fx x x0 1 0 r N fy y y0 1 0 r N fz z 1 0 r theta N fx light fx N fy light fy N fz light fz if theta 0 theta 0 alpha H fx N fx H fy N fy H fx N fz if alpha 0 alpha 0 mColor Ir KaIa mLight Ir Kd theta mLight Ir Ks pow alpha n mColor Ig KaIa mLight Ig Kd theta mLight Ig Ks pow alpha n mColor Ib KaIa mLight Ib Kd theta mLight Ib Ks pow alpha n return mColor void MidCircle int x0 int y0 int r int x y deltax deltay d x 0 y r deltax 3 deltay 5 r r d 1 r glColor3f 0 0f 1 0f 0 0f glBegin GL POINTS glVertex2i x x0 y y0 glVertex2i x x0 y y0 glVertex2i x x0 y y0 glVertex2i x x0 y y0 glVertex2i y y0 x x0 glVertex2i y y0 x x0 glVertex2i y y0 x x0 glVertex2i y y0 x x0 while x y if d 0 d deltax deltax 2 deltay 2 x else d deltay deltax 2 deltay 4 x y glVertex2i x x0 y y0 glVertex2i x x0 y y0 glVertex2i x x0 y y0 glVertex2i x x0 y y0 glVertex2i y y0 x x0 glVertex2i y y0 x x0 glVertex2i y y0 x x0 glVertex2i y y0 x x0 glEnd void MidCircleLight int x0 int y0 int r int x y deltax deltay d x 0 y r deltax 3 deltay 5 r r d 1 r glBegin GL POINTS 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 for i y i y i mColor Phong x0 y0 r i x0 x y0 glColor3ub mColor Ir mColor Ig mColor Ib glVertex2i i x0 x y0 glColor3ub mColor Ir mColor Ig mColor Ib glVertex2i i x0 x y0 while x y if d 0 d deltax deltax 2 deltay 2 x else d deltay deltax 2 deltay 4 x y for 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 for i y i y i mColor Phong x0 y0 r i x0 x y0 glColor3ub mColor Ir mColor Ig mColor Ib glVertex2i i x0 x y0 glColor3ub mColor Ir mColor Ig mColor Ib glVertex2i i x0 x y0 glEnd void myDisplay glClear GL COLOR BUFFER BIT glColor3f 1 0f 1 0f 1 0f if bLight false MidCircle 250 250 60 else MidCircleLight 250 250 60 glFlush void Reshape int w int h glViewport 0 0 GLsizei w GLsizei h glMatrixMode GL PROJECTION glLoadIdentity gluOrtho2D 0 0 GLdouble w 0 0 GLdouble h void processMenuEvents int option switch option case NO LIGHT bLight false glutPostRedisplay break case LIGHT bLight true glutPostRedisplay break void createGLUTMenus int menu menu glutCreateMenu processMenuEvents glutAddMenuEntry No Light NO LIGHT glutAddMenuEntry Light LIGHT glutAttachMenu GLUT RIGHT BUTTON int main int argc char argv glutInit glutInitDisplayMode GLUT RGB GLUT SINGLE glutInitWindowPosition 100 100 glutInitWindowSize 640 480 glutCreateWindow Hello World Init glutDisplayFunc myDisplay glutReshapeFunc Reshape createGLUTMenus glutMainLoop return 0 附 GLUT 菜单知识 给一个程序增加菜单提供了一个比键盘更简单的方法来和程序交互 选择不同选项 而不用去记那些按键 首先要做的是创建菜单 创建菜单函数 glutCreateMenu 的原型如下 int glutCreateMenu void func int value 参数 func 为新建的菜单处理菜单事件的函数名 这个函数的返回值是菜单的标识符 menu identifier 程序中 对每个菜单要指定一个回调函数 而且可以指定相同的函数 下面为菜单增 加一些条目 使用的函数是 glutAddMenuEntry void glutAddMenuEntry char name int value 参数 name 菜单名称的字符串 value 当你选择菜单里的一项后 这个值就返回给上面的 glutCreateMenu 里调用的 函数 这个函数根据函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论