图形学实验八.docx
- 文档编号:8893280
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:13
- 大小:240.53KB
图形学实验八.docx
《图形学实验八.docx》由会员分享,可在线阅读,更多相关《图形学实验八.docx(13页珍藏版)》请在冰豆网上搜索。
图形学实验八
贵州大学实验报告
学院:
计信学院专业:
计科班级:
计科101
姓名
罗琳
学号
1008060016
实验组
无
实验时间
2013-5-14
指导教师
吴云
成绩
实验项目名称
真实感图形生成
实验目的
1、学习OpenGL基本程序结构
2、学习VC++OpenGL应用程序开发技术
3、学习真实感图形的生成算法
实验要求
1.在VC++OpenGL环境下,用已学过的真实感图形生成算法设计并生成一真实感图形。
2.熟悉VC++OpenGL的使用,试着编写一段小程序学习OpenGL基本程序结构。
实验原理
简单光照模型
当光照射在某一物体的表面时,它将被吸收,反射或透射。
从物体表面反射出来的光可分为漫反射和镜面反射。
一个漫反射光照模型为:
I=I1kdcosθ
其中,I为反射光强度,I1为入射光强度,kd为物体表面的反射系数(0≤kd≤1),θ为入射角。
在现实生活中,总存在一些散射现象,使得背光的一面不全黑,这样简单光照模型为:
I=Iaka+Ilkdcosθ
其中,Ia为散射光在整个场景中的入射强度,kd为散射光对该物体表面的反射系数(0≤kd≤1)。
考虑到光强度还与物体与视点的距离的平方成反比,用1/(d+K)代替1/d2,则简单光照模型为:
I=Iaka+(I1kdcosθ)/(d+K)
以上是漫反射,光强度与人的观察方向无关。
在镜面反射中,光照模型为:
Is=I1w(θ,λ)cosnα
其中,w(θ,λ)为反射率曲线,是入射角和光波长的函数(与材料有关),α为观察角,n的取值与表面粗糙程度有关:
n越大,表面越平滑(散射现象少,稍一偏离,明暗亮度急剧下降);
n越小,表面越毛糙(散射现象严重)。
简单光照模型可归纳为:
I=Iaka+I1(kdcosθ+w(θ,λ)cosnα)/(d+K)
用经验系数ks代替w(θ,λ),于是简单光照模型为:
I=Iaka+I1(kdcosθ+kscosnα)/(d+K)
对于多光源情况,简单光照模型为:
I=Iaka+∑I1j(kdcosθ+kscosnαj)/(d+K)
简单光照模型可表示为:
I=Iaka+∑I1j[kd(n·L)+ks(R·S)n]/(d+K)
其中,n,L分别为表面法矢量和光源方向的单位矢量,R,S分别为反射光和观察方向的单位矢量
Gouraud明暗处理
算法原理:
基本思想:
在每个多边形顶点处计算颜色,然后在各个多边形内部进行线性插值,得到多边形内部各点颜色。
即它是一种颜色插值着色方法。
基本步骤:
对多边形网格中的每一个多边形:
1.计算多边形的单位法矢量
2.计算出多面体顶点的法线方向(计算出的平均法向一般与该多面体物体近似曲面的切平面比较接近)
3.用光照模型求得该顶点的亮度。
4.由两顶点的亮度,插值得出棱上各点的亮度。
由棱上各点的亮度,插值得出面上各点的亮度。
双线性光强插值:
假设待绘制的三角形投影为P1P2P3,Pi的坐标为(xi,yi),i=1,2,3;一条扫描线与三角形的两条边分别交于A(xA,yA),B(xB,yB)两点。
P(x,y)是AB上的一点。
A点的颜色IA由P1、P2点的颜色I1、I2线性插值得到:
采用增量算法可以加速计算:
1)当扫描线y递增一个单位变为y+1时,IA、IB的增量分别为⊿IA,⊿IB,即:
2)当x递增一个单位时,IP的增量为⊿IP,即:
算法描述:
1.将曲面近似分割成若干个小平面。
2.计算各小平面得法矢量n1,n2,……nm(m为平面总数)
3.对每一平面,做以下工作,直到结束
4.计算小平面相交顶点上的法线,这个法矢量为所有与其相邻的小平面法矢量的平均值,即:
n=1/k∑ni
5.假设光源的入射角和观察角,根据光照模型,计算各个顶点的光强度
6.根据式(9-1)和(9-2)计算小平面与小平面相交边上各点的光强度
7.根据式(9-3)计算个小平面中各点的光强度
8.endofalgorithm
算法分析:
优点:
能有效的显示漫反射曲面,计算量小,
缺点:
1.高光有时会异常
2.当对曲面采用不同的多边形进行分割时会产生不同的效果。
3.Gouraud明暗处理会造成表面上出现过亮或过暗的条纹,称为马赫带(Mach_band)效应。
改进:
Phong提出双线性法向插值,以时间为代价,解决高光问题
Phong明暗处理
算法原理:
基本思想:
通过对多边形顶点的法矢量进行插值,获得其内部各点的法矢量,又称为法向插值着色方法。
步骤:
1.计算多边形单位法矢量
2.计算多边形顶点单位法矢量
3.对多边形顶点法矢量进行双线性插值,获得内部各点的法矢量
4.利用光照模型计算多边形内部各点颜色
采用增量算法可以加速计算:
1)当扫描线y递增一个单位变为y+1时,NA、NB的增量分别为∆NA,∆NB,即
2)当x递增一个单位时,IP的增量为∆IP,即
算法描述:
1.把曲面近似的分成若干个小平面
2.计算各个小平面的法矢量n1,n2,……,nm(m为平面总数)
3.计算各个小平面相交顶点上的法矢量的平均值,即:
n=(∑ni)/m
4.根据式9-4和9-5计算两平面相邻边上各点法矢量
5.根据式9-6计算各小平面中各点法矢量
6.根据光照模型,计算所有点的光强度
7.endofalgorithm
算法分析:
优点:
Phong着色方法绘制的图形比Gouraud方法更真实,体现在两个方面:
高光区域的扩散,产生正确的高光区域
缺点:
1.Phong着色方法计算量远大于Gouraud着色方法
2.在处理某些多边形分割的曲面时,Phong算法还不如Gouraud算法好。
运用光照模型的光线跟踪算法
把光照模型用于光线跟踪算法,可生成更高质量图像(如上图)。
除了考虑光源外,还要考虑其他物体反射或折射的影响。
被跟踪的入射光线v照射到表面上的Q点,并按r方向反射和按p方向折射,It沿逆折射方向射入表面Q点,Is沿逆镜面反射方向射入表面Q点,n为Q点的表面法矢量,Lj为第j个光源的方向矢量,R为反射光矢量,则观察者在Q点所观察到光强度为(图9-1):
I=kaIa+kd∑Ilj(n·Lj)+ks∑Ilj(S·R)n+ksIs+ktIt
其中,ka,kb,ks和kt分别为散射、漫反射、镜面反射以及透射系数。
与消隐算法中描述的光线跟踪算法不同的是,物体可见面的计算不是在求出跟踪光线与第一个表面交点时结束。
图9-2,入射光线v在物体表面Q点沿r方向反射和沿p透射,在Q点便生成了两条光线,再跟踪这两条光线,找出它们与场景中的其他物体的交点,重复这一过程,直到每一条光线都不再与场景中的任何物体相交为止。
图9-3,表示了一条光线与物体表面只有一个交点情况下的跟踪过程,并可以用树型结构来描述整个跟踪过程,树的每一个结点表示跟踪光线与某个表面的交点,在每一个结点处又分为两个分支,左分支表示表面的反射光线,右分支表示表面的折射。
当跟踪光线走出场景时,分支过程结束。
根据几何光学定律,当入射光线v照射到表面时,产生反射光线r和折射光线p,反射光线与入射光线位于同一表面内,并在表面法线两侧,反射角与入射角相等,折射光线由斯涅耳定律确定,即:
r=v´+2n(9-7)
p=kf(n+v´)-n(9-8)
其中,v´=v/|v·n|,kf=(kη2|v´|2-|v´+n|2)-1/2,kη=η2/η1
kη为η2相对η1的折射系数,v´为入射光线的方向矢量,当kf的分母为虚数时,表示全反射,即It为零。
在计算光线与表面交点处的光强度时,需按后序遍历相应的光线跟踪树。
对树的每一个结点,递归地调用光照模型。
每一结点处的光强度按光线与两表面交点之间的距离进行衰减。
当遍历了整个树以后,按所得光强度在相应象素上显示即可。
理论上,光线跟踪树可无限制的延伸。
除所有光线均射出场景时,树不再继续延伸外,当树中结点处的光强度小于某一特定值或分配的存储区溢出时,树也停止延伸。
这里给出了光线在一封闭透明物体内的内部跟踪过程,在物体内部的镜面反射光线最后被吸收,因此观察者并不能看到它们。
但在光线与表面相交处,观察者能直接或间接的看到射出物体的透射光线p,所以也需对其进行跟踪。
如果在算法中要考虑阴影的话,则需要连接光线与表面相交点至光源Lj的连线:
‐若该连线与场景中的其他物体相交,则光线与表面交点位于该光源的阴影区内,在交点处的局部漫反射和镜面反射的光强度将受到衰减。
‐若表面不透明,光线则无法穿透此面;
‐若表面透明,则需按此面的光照性质对光线进行衰减
实验环境
硬件平台:
PC
软件(推荐):
Windows平台,VisualC++,matlab
实验步骤
1.掌握算法原理;
2.依据算法,编写源程序并进行调试;
3.对运行结果进行保存与分析;
4.把源程序以文件的形式提交;
5.按格式书写实验报告。
实验内容
配置VC++OpenGL环境,并在其基础上使用函数实现简单图形的生成。
实验结果
程序运行截图:
添加OPENGL库
1)在windows/system32目录下应添加:
glu32.dll、glux.dll、glut.dll、glu.dll
2)在VC98/Include/GL目录下应添加:
GL.H、GLU.H、GLAUX.H
3)在VC98/Lib/目录下应添加:
GLU32.LIB、OPENGL32.LIB、
GLAUX.DLL、GLUT.LIB
主程序代码:
#include
voiddisplay()
{glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(-0.5,-0.5);
glVertex2f(-0.5,0.5);
glVertex2f(0.5,0.5);
glVertex2f(0.5,-0.5);
glEnd();
glFlush();
}
intmain(intargc,char**argv)
{glutInit(&argc,argv);
glutCreateWindow("simple");
glutDisplayFunc(display);
glutMainLoop();
}
实验总结
通过这次实验,利用openGL的编程,绘制了一些简单的真实感图形,在编写中知道了OpenGL的库函数的一些功能,并初步掌握了OpenGL下编程步骤和方法。
了解到了我们日常所见到的真实感图形生成的基本原理,加强了对这门课程的了解和兴趣。
指导教师意见
签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)