|
在OpenGL中利用双缓存技术,分配两个帧缓存区,在连续显示三维曲面时,一个帧缓冲区中的数据执行绘制曲面命令的同时,另一个帧缓存区中的数据进行图形显示。当前可见视频缓存称为前台视频缓存,不可见的正在绘图的视频缓存称为后台视频缓存。当后台视频缓存中的数据要求显示时,OpenGL就将它拷贝至前台视频缓存,显示硬件不断地读可见视频缓存中的内容,并把结果显示在屏幕上。
应用双缓存,每一帧三维曲面只在绘制完成之后才显示出来,所以观察者可以看到每一帧完整三维曲面,而不是曲面的绘制过程。
使用双缓存实现三维曲面动态显示的步骤如下:
(1)设置OpenGL窗口显示属性为双缓存机制:auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);
(2)利用OpenGL基本绘图命令绘制三维曲面;
(3)一帧曲面绘图结束后缓存拷贝,切换缓存:auxSwapBuffers();
SwapBuffers(wglGetCurrentDC());
3、利用显示列表提高程序运行效率
显示列表是一组预先存储起来留待以后调用的函数语句。调用显示列表时就按次序执行其中的函数。显示列表将反复执行的绘图操作以编译好的命令方式进行存储,设计成命令的高速缓存,而不是动态的数据库缓存,所以可以优化程序运行性能。
实现和调用显示列表的方法:
(1)创建列表:
void glNewList(Gluint list,Glenm mode);
void glBegin(Glenum mode);
void glEnd(void);
void glEndList();
(2)调用列表:
void glCallList(Gluint list);
void CNurbsView::Onhuitu() { HWND hWnd=GetSafeHwnd(); HDC hDC=::GetDC(hWnd); wglMakeCurrent(hDC,hglrc); //设置当前着色表 drawsurbs(); //动态显示三维曲面子程序 wglMakeCurrent(NULL,NULL);//着色表非当前化 SwapBuffers(hDC); //交换缓存 } void CNurbsView::drawsurbs() { …… myinit(); //初始化子程序 jixu=20; //动态显示帧数 While(jixu) { readdata(); //读数据文件子程序 interplator(); //数据插值子程序 orthoprojection(); //投影变换子程序 xiaoying(); //消隐子程序 glPushMatrix(); glColor3f(0.0f,1.0f,1.0f); //颜色设置 glLineWidth(2.0); //线宽设置 glNewList(axis_list,GL_COMPILE);//坐标轴显示列表 …… glEndList(); glNewList(sufer_list,GL_COMPILE); //三维曲面绘制显示列表 …… glEndList(); glCallList(axis_list); glCallList(sufer_list) glFlush(); //强制绘图 glPopMatrix(); auxSwapBuffers(); //缓存拷贝 SwapBuffers(wglGetCurrentDC()); //切换缓存 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //为绘下帧曲面清除缓冲区 jixu-- deley(); //延时子程序 } }
void CNurbsView::myinit() { glClearColor(0.03,0.4,0.4,0.4); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); auxInitDisplayMode(AUX_DOUBLE|AUX_RGBA);//设置成双缓存模式 } | 某数据场三维曲面动态显示仿真系统实例
根据以上思想,利用OpenGL双缓存及显示列表技术,基于某数据场数据,开发了三维曲面图形动态显示仿真系统,该实例中视窗中三维曲面图形随数据场的数据的改变而动态显示,图2为程序运行中某一时刻的显示结果。
结束语
在微机平台上,利用VC6.0的OpenGL根据数据场的分布进行三维曲面的动态显示是切实可行的,尤其采用双缓存及显示列表技术可以得到很好的三维曲面生成速度,这种动态显示技术可以推广应用在需要进行实时动态显示的数据处理方面。  图2 三维曲面数据场动态显示仿真系统展示图收藏
|