下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 vc论文

vc论文.doc

vc论文

风中鹰
2011-12-13 0人阅读 举报 0 0 暂无简介

简介:本文档为《vc论文doc》,可适用于IT/计算机领域

VC环境下OpenGL动画的实现方式与特性分析摘要:本文给出了VC环境下实现OpenGL动画的几种方法,并通过实验示例总结了如何在OpenGL渲染窗口中输出和提高帧速率。借助这些手段,可以极大地提高动画的显示性能。关键词:OpenGL计算机动画运动模拟THEIMPLEMENTATIONOFOpenGLANIMATIONBASEDONVCSongYongjunSuHonggen(GraduateSchoolofChineseAcademyofSciences,Beijing)(InstituteofSoftware,CASBeijing)AbstractThepaperintroducesafewmethodstoimplementDcomputeranimationbyVisualCcallingthefunctionsinOpenGLundertheenvironmentofwindowsExamplesillustratehowtogetthefpsinOpenGLrenderingwindowBymeansofthismethods,userscanimprovethepropertyoftheirDanimationeffectivelyKeywordsOpenGLComputeranimationSimulating前言计算机动画是采用计算机技术,以一定的速率连续播放的由计算生成的静态离散画面(帧),利用人眼的视觉残留特性,这些画面序列在人眼的视网膜上形成了连续运动图像。计算机动画既可以描述角色的形象或位置的连续变化,也可以描述观察者视点位置和视线方向的连续变化既可以基于客观世界中的物理规律及人们的日常行为方式,也可以源于艺术家的精巧构思和大胆创意因而广泛应用于科学演示、工程仿真、教育训练军事模拟以及更接近人们生活的广告设计、影视特技、电子游戏中。OpenGL是用于图形硬件的软件接,是一个可移植的、能在微机上实现并且速度很快的D图形和建模库。使用OpenGL,可以运用图形学的各种技术来生成真实感图形或以图像化的方式演绎现实,使程序员得以创建交互式程序来产生色彩丰富的三维运动图形。OpenGL本身只提供了一系列预封装的图形处理函数,要完成所谓的OpenGL程序,必须借助于编程语言,本文即是讨论VC下OpenGL动画的实现。计算机动画的显示特性对计算机监视器而言,刷新频率定义为垂直扫描频率,即每秒刷新屏幕的次数。一般来说,我们需要的刷新频率依赖于图像的亮度(首先受限于硬件的能力)。当图像画面以一定的刷新频率显示时,我们所观察到的画面将不再闪烁、刺眼。例如,电影胶片的放映频率为幅秒,但一个高速旋转的遮光器通常打断一幅画面二至三次,使电影银幕的刷新频率达到Hz或Hz,从而防止了由于画面很亮引起的闪烁现象。类似地,目前流行的微机系统监视器的刷新频率通常设置为~Hz。对给定的计算机动画应用程序,通常是以每秒更新动画帧的次数即帧速率(fps)来度量其显示性能的。对于较低的帧速率(fps或fps),人眼看到的动画是从一幅图像突然跳到下一幅图像,当帧速率达到fps时会有平滑的活动,但能真正产生计算机平滑动画的最小帧速率是fps,在某些视觉模拟程序中,帧速率甚至要维持在fps以上。实际得到的帧速率受到计算机运算能力和图像的复杂程度以及操作系统性能的影响,同时计算机监视器的刷新速率会限制你眼睛可以得到的帧速率。如果监视器的刷新速率设置为Hz,而应用程序生成的帧速率超出fps,则有些帧会在屏幕刷新之前生成并被下一帧覆盖。一般应用中,超出硬件刷新频率的帧速率并没有什么实际意义,只是浪费CPU时间。我们可以利用Windows的两个API函数QueryPerformanceFrequency、QueryperformanceCounter和LARGEINTEGER类型进行简单的帧速率测试,。OpenGL动画的实现机制在Windows编程模型中实现动画效果的基本思路是每次以不同却连续的图像刷新显示视窗。采用规范的Windows事件模型,应在WMPAINT消息处理程序中完成OpenGL渲染操作,并且通过OpenGL编程确保每次渲染都会产生下一个序列帧。这样,通过某种机制产生一系列WMPAINT消息,就能在显示视ApplicationsandSoftwareApr窗中渲染出系列的连续帧,也就实现了OpenGL动画效果。基于Windows计时器的机制窗口计时器是一个简单有效的方法:创建一个Windows计时器,在SetTimer()函数中设置发出WMTIMER消息的时间间隔。通过响应WMTIMER消息,反复调用WMPAINT消息处理程序,并在WMPAINT消息处理程序中进行图像的OpenGL渲染操作,就可以生成动画序列。LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM){staticLARGEINTEGERtimerFrequencystaticLARGEINTEGERstartTimestaticintnFrames=switch(message){caseWMCREATE:Windowcreation,setupforOpenGLQueryPerformanceFrequency(timerFrequency)QueryPerformanceCounter(startTime)SetTimer(hWnd,,,)CreateatimerthatfirestimesasecondbreakcaseWMTIMER:InvalidateRect(hWnd,,FALSE)SendtheWMPAINTbreakcaseWMPAINT:{RenderScene()CallOpeGLrenderingcodeSwapBuffers(hDC)SwapthebuffersnFramessif(nFrames>){charcOutBufferLARGEINTEGERcurrentTimefloatfpsQueryPerformanceCounter(currentTime)GetthecurrentTimefps=(float)nFrames((float)(currentTimeQuadPartstartTimeQuadPart)(float)timerFrequencyQuadPart)sprintf(cOutBuffer,f,fps)DisplaythefpsSetWindowText(hWnd,cOutBuffer)nFrames=QueryPerformanceCounter(startTime)Resetsthetimer}ValidateRect(hWnd,)}breakcaseWMDESTROY:KillTimer(hWnd,)Killthetimerthatwecreated}}我们在该段代码中,渲染了一个以fps(每毫秒渲染一帧)旋转的地球,并且在标题栏中输出实际得到的平均帧速率,用于设置计时器的SetTimer()函数原型为:UINTSetTimer(HWND,UINT,UINT,TIMEPROC)。其中的第一个参数是窗口句柄,第二个参数是计时器事件ID,第三个参数为以毫秒计的发出WMTIMER消息的时间间隔,第四个参数可以设置回调函数。虽然我们在程序中设置的帧速率为fps,实际得到的帧速率却只有fps左右。这主要是受到了操作系统计时器的分辨率的限制。特定的计算机硬件的计时器是稳定、精确的,但不同的操作系统具有不同的分辨能力。通过以下实验数据,可以得出Windows计时器的最佳分辨率约为毫秒,而Windows计时器的最佳分辨率约为毫秒。WindowsWindowsSetTimer()中的时间间隔实际帧速率SetTimer()中的时间间隔实际帧速率~ms~fps~msfps~ms~fps~msfps~ms~fps~msfps~ms~fps~msfps~ms~fps~msfps在Windows中,实验环境下的最高平均帧速率为fps。可见,基于Windows计时器的方法能力有限。短接WMPAINT消息机制请注意上述代码段的WMPAINT过程末尾的一行代码:ValidateRect(hWnd,)。规范的Windows图形编程采用这种方式通知系统已经完成了刷新操作。如果我们省略这一行代码,就可以得到~fps的帧速率。这是因为Windows认为窗口总是处于需要刷新的状态,并且会源源不断的发送WMPAINT消息来调用渲染代码RenderScene()。采用这种方法,应用程序可以响应主要的Windows消息,如按键、鼠标移动等,同时能获得很高的帧效率。事件插入循环尽管短接WMPAINT方法已经足够快,但WMPAINT并不是最高优先级的窗口消息。Windows处理或系统消息通常会减慢OpenGL的渲染速度。如果你忽略应用程序的交互性而追求尽可能高的帧速率,可以采用事件插入循环的方法,在消息循环之外进行渲染:intAPIENTRYWinMain(HINSTANCE,HINSTANCE,LPSTR,int){while(){if(PeekMessage(msg,,,,PMREMOVE))TranslateMessage(msg)DispatchMessage(msg)if(msgmessage==WMQUIT)breakif(hRC)RenderScene()SwapBuffers(hDC)}}采用这种方式可以得到~fps的帧速率。但可能会妨碍敲键、鼠标移动、窗处理,甚至终止程序,直到显示完成所有OpenGL渲染帧之后。唯一的优点是有可能获得比其它方法稍快一点的帧速率。创建OpenGL渲染线程如果在运行前面的各个示例的同时,在屏幕上移动渲染窗会发现地球的旋转速度明显减慢,甚至完全停止。另一种现象是窗口显示的帧速率不断变化,帧速率越高,其波动越大。解决方案是放弃基于消息的编程,创建自己的渲染线程。创建OpenGL渲染线程,与创建其它辅助线程相似,需要声明一个线程处理程序,并在必要时访问它:staticHANDLEhThreadHandle=hThreadHandle=(HANDLE)beginthread(RenderingThreadEntry,,)voidRenderingThreadEntry(void*pVoid)􀀁􀀂RenderingThreadEntryPoint{SetupRC()SetuptherenderingcontextRenderScene()SwapBuffers(hDC)endthread()Terminatethethreadnicely}创建OpenGL渲染线程,在本实验环境下可以得到fps的帧速率。结束语前文的所有示例,都是使后继帧中的球体绕Z轴旋转,并重画来实现运动效果的(glRotatef(fRot,f,f,f)fRot=)。除特殊说明外,实验环境为:IntelPG,MB内存,NVIDIAGeForceM显卡,显示器刷新频率HZWindows,VC,OpenGL,*渲染窗口。在不同的软硬件平台下,实际得到的帧速率可能会有所差异。在示例程序运行时可以看到,帧速率越高,地球转动的越快。在实际应用中,较高的帧速率应该能够产生平滑的动画,而不仅仅是产生快速的动画。可以将旋转角度fRot与时间相关联,就能在给定时间内实现一段平稳光滑的动画序列。参考文献苏鸿根,三维计算机图形学OpenGLforWindows编程,中国科大研究生讲义RichardSWright,JrMichaelSweet,OpenGLSuperBible,WaiteGroupPress,鲍虎军、金小刚、彭群生,计算机动画的算法基础,浙江大学出版社,

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/4

vc论文

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利