1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,7,图形技术基础,-,真实感图形技术,7.4,隐藏线和隐藏面的消除,在三维图形显示算法中,物体所有部分,包括可见与不,可见部分均被投影到投影平面上并被显示出来。这样画,出的线框图往往具有,多义性,。,7.4,隐藏线和隐藏面的消除,7.4.1,隐藏线和隐藏面问题,要使物体更具有真实感,必须在显示时消去由于物体自身遮挡或物体间相互遮挡而无法看见的棱线,即,隐藏线,。,影响三维真实感图形的因素主要是如下几个问题:,(1),消去图形中的不可见部分,既“消隐”。,(2),光照效应问题。,(3),材质问题。,
2、解决上述问题的关键是算法和数据结构问题,而且主要是算法问题。,消隐算法分为两大类,:,物空间消隐算法,是利用物体间的几何关系来判断这些物体的隐藏与可见部分,这种算法利用计算机硬件的浮点精度来完成几何计算(如相交),因此这种方法精度高,不受显示器分辨率的影响。,像空间消隐算法,则把注意力集中在最终的图像上,对光栅扫描显示器而言,即对每一像素进行判断,确定哪些是可见部分。这种算法只能以与显示器分辨率相适应的精度来完成,使得这种方法不够精确。,7.4.2,消隐算法中的基本测试方法,投影变换,最小最大测试,包含性测试,深度测试,可见性测试,最小最大测试,这种测试也叫重叠测试或边界盒测试。用来检查两个多
3、边形是否重叠。,0,y,x,0,y,x,或,或,能够快速判断,两个多边形,不相交。,包含性测试,包含性测试,是检查一个给定的点是否位于给定的多边形或多面体内。,夹角求和算法,,计算从测试点方向看的每条有向边所对的角度,如果角度和等于,0,,则点在多边形外;如果角度和为 ,则该点在多边形内。,深度测试,深度测试是用来测定一个物体遮挡另外物体的基本方法,。,优先级测试,O,y,z,x,A,B,C,N,可见性测试,可见性测试用来确定景物中潜在的可见部分,对于,凸多面体,,可以利用,平面的法矢,来判断,平面的可见性,:,平面外法矢有正分量指向观察者方向的面是可见的,否则是不可见的。,平面的外法矢在,Z
4、方向有,正分量的面,是,可见,的,而有,负分量的面,是,不可见的,。,消隐算法有:,Z,向深度缓冲区算法,扫描线算法,循环细分算法,Z,向深度缓冲区算法,:对景物中的每个多边形找到当多边形投,影到屏幕时位于多边形内或边界上的所有像素,(,x,y,),。对每一,个像素,在,(,x,y,),处计算多边形的深度,z,,并与,z,缓冲区相应单,元的当前值相比较,如果,z,大于,z,缓冲区中的当前值,则该多,边形比其他早已存在于像素中的多边形更靠近观察者。在这,种情况下,用,z,值更新,z,缓冲区的对应单元。同时,将,(,x,y,),处,的多边形的明暗值写入缓冲区中对应于该屏幕像素的单元之,中。当所有
5、的多边形被处理完后,缓冲区中保留的是已消隐,的最终结果。,帧缓冲器,保,存各像素颜色值,Z,缓冲器,-,保,存各像素处物体深度值,Z,缓冲器中的单元与帧缓冲器中的单元一一对应,Z,缓冲器算法是所有图像空间算法中最简单的一种隐藏面消除算法。,在象素级上以近物取代远物,.,优点:,1,)简单稳定,利于硬件实现,2,),不需要整个场景的几何数据,缺点,:,1,)需要一个额外的,Z,缓冲器,2,)在每个多边形占据的每个像素处都要计算深度值,计算量大,7.5,图形标准,为了能够让交互式图形系统在不同的计算机和图形设备之间进行移植,制定图形软件的标准是非常必要的。,可移植性包括:,应用程序在不同系统之间的
6、可移植性,应用程序与图形设备的无关性,图形数据的可移植性,程序员的可移植性,交互式图形系统中有三个接口必须要实现标准化:,第一个接口,:,应用程序与图形软件的接口,图形核心系统,GKS,(,graphics kernel system),第二个接口,:,图形软件与图形输入输出设备之间的 接口,计算机图形接口,CGI(,Computer,Graphics Interface),第三个接口,:,数据接口,它规定了记录图形信息的数据文件的格式,初始图形交换规范,IGES,产品模型数据交换标准,STEP,图形标准,是一组由基本图元(点、线、面)和属性(线型、颜色等)构成的标准通用图形系统。它们以子程序
7、的形式支持应用图形系统。应用程序通过调用这些图形标准子程序,即可生成图形和图像,并通过交互显示设备实现图形的输入输出。,标准图形系统有:,二维图形核心系统,GKS,(,graphics kernel system),三维图形核心系统,GKS-3D(graphics kernel system-3D),程序员级层次交互式图形系统,PHIGS(programmer,hiberarchy,interface graphics system),3.5,图形标准,图形程序库,OpenGL,作为标准图形软件接口,是由几百个指令或函数组成。,OpenGL,功能有:,绘制三维物体,观察物体,指定颜色模式,光照
8、增强图像效果,管理位图和图像,纹理映射,制作动画,交互技术,OpenGL,编程,三维变换,真实感显示,图形显示,正平行投影,实例,编写程序,/,/,编写,OpenGL,程序,/,新建工程文件,在,VC,界面上,从菜单,File,New:,建立,MFC,应用程序,选择工程文件类型,并填写工程文件名称,配置工程文件,FileView,窗格,添加,OpenGL,库,增加,OpenGL,库,增加成员变量,COpenGLPlatView,m_hRC,增加成员变量,COpenGLPlatView,m_hRC,增加变量,:,记录,OpenGL,渲染句柄,a handle to an OpenGL rend
9、ering context,增加成员函数,COpenGLPlatView:OnCreate,通过菜单,View,ClassWizard,进入此对话框,修改,COpenGLPlatView:OnCreate,代码,int,COpenGLPlatView:,OnCreate,(LPCREATESTRUCT,lpCreateStruct,),if(,CView:OnCreate(lpCreateStruct,)=-1),return-1;,/TODO:Add your specialized creation code here,/,/New codes begin:,修改,COpenGLPlatV
10、iew:OnCreate,代码,/The PIXELFORMATDESCRIPTOR structure describes,/the pixel format of a drawing surface.,PIXELFORMATDESCRIPTOR pfd=,sizeof(PIXELFORMATDESCRIPTOR,),/size of this pfd,1,/version number,PFD_DRAW_TO_WINDOW|,/support window,PFD_SUPPORT_OPENGL|,/support OpenGL,PFD_DOUBLEBUFFER,/double buffer
11、ed,PFD_TYPE_RGBA,24,/24-bit color depth,0,0,0,0,0,0,/color bits ignored,0,/no alpha buffer,0,/shift bit ignored,0,/no accumulation buffer,0,0,0,0,/,accum,bits ignored,32,/32-bit z-buffer(depth),0,/no stencil buffer,0,/no auxiliary buffer,PFD_MAIN_PLANE,/main layer,0,/reserved,0,0,0,/layer masks igno
12、red,;,修改,COpenGLPlatView:OnCreate,代码,HDC,hDC,=,GetDC,()-,GetSafeHdc,();,/,Get the best available match of pixel format for the device context,/In other words,if this computer doesnt support features that I,/asked for,try to get the next best thing.i.e.16-bit color mode,/instead of 24-bit color mode.
13、int,pixelFormat,=,ChoosePixelFormat(hDC,/Set the pixel format to the best pixel format I can get(see above),/and if that operation fails,bring up a message box that tells the,/user the error.,if(!,SetPixelFormat(hDC,pixelFormat,&pfd),MessageBox(,Error,:Unable to Set Pixel Format in CGLTemplate1View
14、OnCreate(),Application Error,MB_ICONERROR);,修改,COpenGLPlatView:OnCreate,代码,/,Creates an OpenGL rendering context so that OpenGL knows how to draw,/,to this view.You cant use OpenGL in MFC without using the handle,/that this function returns,m_hRC,=,wglCreateContext(hDC,);,/New codes end.,/,return 0
15、增加成员函数,COpenGLPlatView:OnDestroy,通过菜单,View,ClassWizard,进入此对话框,修改,COpenGLPlatView:OnDestroy,代码,void,COpenGLPlatView:,OnDestroy,(),CView:OnDestroy,();,/TODO:Add your message handler code here,/,/New codes begin:,/Set:a specified OpenGL rendering context=NULL,/Set:current rendering context=NULL,wglMa
16、keCurrent(NULL,NULL);,/Delete the handle to an OpenGL rendering context,wglDeleteContext(m_hRC,);,/New codes end.,/,增加成员函数,COpenGLPlatView:OnSize,通过菜单,View,ClassWizard,进入此对话框,修改,COpenGLPlatView:OnSize,代码,void,COpenGLPlatView:OnSize(UINT,nType,int,cx,int,cy),CView:OnSize(nType,cx,cy);,/TODO:Add your
17、message handler code here,/,/New codes begin:,HDC,hDC,=,GetDC,()-,GetSafeHdc,();,wglMakeCurrent(hDC,m_hRC,);,glMatrixMode(GL_PROJECTION,);,glLoadIdentity,();,double d=10;,double n=100;,glOrtho(-cx/n,cx/n,-cy/n,cy/n,-d,d);,glMatrixMode(GL_MODELVIEW,);,glViewport(0,0,cx,cy);,glShadeModel(GL_FLAT,);,/S
18、et shading mode,wglMakeCurrent(NULL,NULL);,/New codes end.,/,修改,COpenGLPlatView:OnDraw,代码,void,COpenGLPlatView:OnDraw(CDC,*,pDC,),COpenGLPlatDoc,*,pDoc,=,GetDocument,();,ASSERT_VALID(pDoc,);,/TODO:add draw code for native data here,/,/New codes begin:,HDC,hDC,=,GetDC,()-,GetSafeHdc,();,wglMakeCurren
19、t(hDC,m_hRC,);,glClearColor(0,1,1,1);,glClear(GL_COLOR_BUFFER_BIT,);,glLoadIdentity,();,glColor3f(1.0,0.0,0.0);,auxWireTeapot(2.0);,SwapBuffers(GetDC,()-,GetSafeHdc,();,wglMakeCurrent(NULL,NULL);,/New codes end.,/,修改文件,OpenGLPlatView.cpp,/,OpenGLPlatView.cpp,:implementation of the,COpenGLPlatView,cl
20、ass,/,#include,stdafx.h,#include,OpenGLPlat.h,#include,OpenGLPlatDoc.h,#include,OpenGLPlatView.h,/,/New codes begin:,#include,GL/GLAUX.H,#include,GL/GL.H,#include,GL/GLU.H,/New codes end.,/,运行结果,菜单,:Build,Rebuild All,运行,:F5,总结,:,基本,OpenGL,程序编写过程,新建,MFC,工程文件,配置工程文件,添加,OpenGL,库,增加成员变量,COpenGLPlatView,m_hRC,增加成员函数,COpenGLPlatView:OnCreate,增加成员函数,COpenGLPlatView:OnDestroy,增加成员函数,COpenGLPlatView:OnSize,修改,COpenGLPlatView:OnDraw,代码,修改文件,OpenGLPlatView.cpp,增加,#include,文件,编译、连接,&,运行,






