正文

VC中OpenGL编程的步骤2006-11-03 11:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/19946.html

分享到:

VCOpenGL编程的步骤:

1  使用AppWizard创建应用程序框架,在文档和视结构中,视负责窗口中内容的显示,因此所有的OpenGL绘制工作应放在视类进行;

2  利用ClassWizard给视类添加如下成员函数:

重载PreCreateWindow函数;

响应WM_CREATE消息的OnCreate函数;

响应WM_SIZE消息的OnSize函数;

响应WM_ERASEBKGND消息的OnEraseBKgnd函数;

响应WM_DESTROY消息的OnDestroy函数;

重载OnInitialUpdate函数

3  PreCreateWindow函数中加入如下语句:

cs.style=cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN

窗口必须设置以上属性,否则像素格式就不能正确设置;

4  设置像素格式,创建绘制描述表。这一过程放在响应WM_CREATE消息的OnCreate函数中。WM_CREATE消息窗口被创建时产生。

像素格式(pixelformatdescriptor定义显示设备的三十特性,比如颜色位平面的数量和组织方式(RGB模式还是索引模式),是否采用双缓存模式等等。OpenGlGDIWindows的图形设置接口)的像素格式不同,而Windows应用中窗口的缺省设置是GDI像素格式,所以需要为执行OpenGL绘制任务的窗口专门指定像素格式。对每个窗口,像素格式只能设置一次。

绘制描述表(DC)与设置描述表(RC)类似,但包含了更多有关OpenGL绘制信息。OpenGL依赖绘制描述表操作显示硬件,因此调用OpenGL命令前,必须创建描述表并使其成为当前的绘制描述表。

设置像素格式、创建绘制描述是每个窗口进行OpenGl绘制前必不可少的步骤,所以放在OnCreate函数中最为合适。

5  响应WM_SIZE消息。当视窗的大小改变时,需发送WM_SIZE消息。在WM_SIZE的消息响应函数中可以获知改变后窗口的大小,因此在其中可以调用glViewport对场景的窗口变换进行更改以后适应窗口大小的改变,还可通过glFrustum等函数重新设置投影变换,使得当窗口的大小发生改变时,显示在窗口中的场景不会发生扭曲。

6  响应WM_ERASEBKGND消息。当需要重新设置窗口背景时,产生WM_ERASEBKGND消息。处理该消息的缺省操作是用当前背景色填充整个窗口。处理函数做适当改变:注释掉OnEraseBKgnd函数所有的语句,添加return TRUE,使该函数不执行操作,仅返回TRUE值。

7  重载OnInitUpdate函数OnInitUpdate函数为视对象专有,在视第一次显示之前,文档和视的结构刚刚被建起之后调用,此时,从视对象中可以获得与之相连的文档对象中的信息。根据文档和视的关系,OpenGL的绘制信息一般通过文档对象存取,通过视对象,因此,OnInitUpdate中适合做OpenGL的绘制前的初始化工作。初始化工作包括创建列表(显示列表索引作为视类对象的成员变量保存)设置光照参数,装载纹理映射贴图,确定融合方式及参数,设置雾化参数以及其它绘制场景前需完成的工作。必要时可设置时钟,程序在以后的运行中将定时接收到WM_TIMER消息,只要在该消息的响应函数中有规律地改变场景设置,并使视图重新绘制,就可以在窗口中形成动画效果。

8  OnDraw函数中绘制OpenGL场景。所有的绘制工作都应放在OnDraw函数中。

9  响应WM_TIMER消息。WM_TIMER消息由程序中设定的时钟产生。若未设定时钟,则不用响应WM_TIMER消息。WM_TIMER的消息处理函数中,更新场景,然后发送WM_PAINT消息或直接调用OnDraw函数,使窗口中显示改变后的场景。如此反复,形成动画。

10 响应WM_DESTROY消息。WM_DESTROY消息在窗口销毁时产生。在WM_DESTROY的消息的处理函数中删除描述表。

必要时重载基本应用框架中应用程序类的OnIdle函数。OnIdle函数在程序的消息队列为空时被调用,该函数执行的功能与gluIdleFunc函数设定的空闲回调函数的功能相似,即执行一些后台任务。

 

阅读(5411) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册