我一直在试图寻找OpenGL应用程序的一般框架,有了这个模板,以后就可以像MFC中创建Dialog-based, SDI,MDI应用程序那样创建OpenGL应用程序。下面就是我在这方面总结的一些经验,我以OpenGL+glut为例:
整个应用程序最少应该包含下列函数:
Init():OpenGL是个状态机(State Machine),在整个渲染过程中保持不变的状态应该在这里设置。如果需要的 话,这里还应该设置窗口系统。
Rendering():渲染函数,这个函数理所当然的成为整个程序的核心.
Reshape():调用窗口的大小。当窗口不是全屏状态时,改变窗口的大小应该调用这个函数。应该根据窗口的大小,调整视口和投影的相关参数。典型的Reshape()函数如下:
void Reshape(int width, int height)
{
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.5f,150.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
在OpenGL的官方网站中的FAQ中,也提出了一个框架:
program_entrypoint
{
// Determine which depth or pixel format should be used.
// Create a window with the desired format.
// Create a rendering context and make it current with the window.
// Set up initial OpenGL state.
// Set up callback routines for window resize and window refresh.
}
handle_resize
{
glViewport(...);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//Set projection transform with glOrtho, glFrustum, gluOrtho2D, gluPerspective, etc.
}
handle_refresh
{
glClear(...);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Set view transform with gluLookAt or equivalent
// For each object (i) in the scene that needs to be rendered:
// Push relevant stacks, e.g., glPushMatrix, glPushAttrib.
// Set OpenGL state specific to object (i).
// Set model transform for object (i) using glTranslatef, glScalef, glRotatef, and/or equivalent.
// Issue rendering commands for object (i).
// Pop relevant stacks, (e.g., glPopMatrix, glPopAttrib.)
// End for loop.
// Swap buffers.
}
可以看的出来,官方指定的这个框架和我分析的那个框架是差不多的:)
参考文献:
1. http://www.opengl.org/resources/faq/technical/gettingstarted.htm#gett0008
-----------------------------致力于多媒体技术,成为有思想的软件工程师------------------------
此文章为我原创作品,若要转载,请和本人联系,或注明出处。
欢迎大家对文章内容提出宝贵意见,同时希望大家及时指出文中的错误之处,这样我可以及时更正。
我的联系方式:
QQ: 7578420
Email: jerrydong@tom.com
----------------------------------------------------------------------------------------
OpenGL之应用程序框架
最新推荐文章于 2024-10-04 23:53:47 发布