OpenGL辅助库的基本使用
OpenGL 是一个开放的系统,它是独立于任何窗口系统或操作系统的。尽管它包含了许多图形函数,但它却没有窗口函数,也没有从键盘和鼠标读取事件的函数,所以要初学者写出一个完整的图形程序是相当困难的。另外,OpenGL 图形函数中只提供基本的几何原形:点、线、多边形,因此要创建基本的三维几何体如球、锥体等,也很不容易。而 OpenGL 辅助库就是为解决这些基本问题专门设计的,它提供了一些基本的窗口管理函数和三维图形绘制函数,能帮助初学者尽快进入 OpenGL 世界,掌握关键的三维图形技术,体会其中奇妙的乐趣。但是,对于复杂的应用,这些函数远远不够,只能作为参考。
辅助库函数分类
辅助库函数大致分为六类:
1.窗口初始化和退出。
相关函数有三个,这里将详细介绍:
void auxInitWindow(GLbyte *titleString) |
打开一个由 auxInitDisplayMode() 和 auxInitPosition() 指定的窗口。函数参数是窗口标题,窗口背景缺省颜色是 RGBA 下的黑色或颜色表 (color_index) 下的 0 号调色板的颜色。按下 Escape 键可以完成关掉窗口、结束程序、全部清屏三项功能。
void auxInitDisplayMode(GLbitfield mask) |
设置窗口显示模式。基本模式有 RGBA 或颜色表、单或双缓存,也可指定其他附加模式:深度、模板或累积缓存 (depth,stencil,and/or accumulation buffer)。参数 mask 是一组位标志的联合(取或),AUX_RGBA 或 AUX_INDEX、AUX_SINGLE 或 AUX_DOUBLE,以及其它有效标志 AUX_DEPTH、AUX_STENCIL 或 AUX_ACCUM。
void auxInitPosition(GLint x,GLint y,GLsizei width,GLsizei height) |
设置窗口位置及大小。参数 (x,y) 为窗口的左上角点的屏幕坐标,参数 (width,height) 为窗口的宽度和高度,单位为象素,缺省值为 (0,0,100,100)。
2.窗口处理和事件输入。
当窗口创建后,且在进入主函数循环之前,应当登记以下列出的回调函数 (callback function):
void auxReshapeFunc(void(*function)(GLsizei,GLsizei)) |
定义窗口改变时形状重定函数。参数 function 是一个函数指针,这个函数带有两个参数,即窗口改变后的新宽度和新高度。通常,function 是 glViewport(),显示裁减后的新尺寸,重定义投影矩阵,以便使投影后图像的比例与视点匹配,避免比例失调。若不调用 auxReshapeFunc(),缺省重定物体形状的函数功能是调用一个二维的正射投影矩阵。运用辅助库,窗口将在每个事件改变后自动重新绘制。
void auxKeyFunction(GLint key,void(*function)(void)) |
定义键盘响应函数。参数 function 就是当按下 key 键时所调用的函数指针,辅助库为参数 key 定义了几个常量:AUX_0 至 AUX_9、AUX_A 至 AUX_Z、AUX_a 至 AUX_z、AUX_LEFT、AUX_RIGHT、AUX_UP、AUX_DOWN(方向键)、AUX_ESCAPE、AUX_SPACE 或 AUX_RETURN。
void auxMouseFunc(GLint button,Glint mode,void(*function)(AUX_EVENTREC *)) |
定义鼠标响应函数。参数 function 就是当鼠标以 mode 方式作用于 button 时所调用的函数。参数 button 有 AUX_LEFTBUTTON、AUX_MIDDLEBUTTON 或 AUX_RIGHTBUTTON(以右手为标准)。参数 mode 代表鼠标触击状态,击中时为 AUX_MOUSEDOWN,释放时为 AUX_MOUSEUP。参数 function 必须带一个参数,它是指向结构 AUX_EVENNTREC 的指针。当函数 auxMouseFunc() 被调用时将为这个结构分配相应的内存。通常用法类似如下:
void function(AUX_EVENTREC *event) |
3.颜色表装入。
因为 OpenGL 本身没有窗口系统,所以依赖于窗口系统的颜色映射就没法装入颜色查找表。如果采用颜色表模式,就要用到辅助库提供的用 RGB 值定义的单个颜色索引函数:
void auxSetOneColor(GLint index,GLfloat red,GLfloat green,GLfloat blue) |
设置自定义颜色的索引。参数 index 即索引号,参数 red、green、blue 分别为红、绿、蓝值,范围在 (0,1) 内。
4.三维物体绘制。
每组三维物体包括两种形式:网状体 (wire) 和实心体 (solid)。网状体没有平面法向,而实心体有,能进行光影计算,有光照时采用实心体模型。下面这些函数的参数都是定义物体大小的,可以改变。
void auxWireSphere(GLdouble radius) |
绘制球。
void auxWireCube(GLdouble size) |
绘制立方体。
void auxWireBox(GLdouble width,GLdouble height,GLdouble depth) |
绘制长方体。
void auxWireTorus(GLdouble innerRadius,GLdouble outerRadius) |
绘制环形圆纹面。
void auxWireCylinder(GLdouble radius,GLdouble height) |
绘制圆柱。
void auxWireIcosahedron(GLdouble radius) |
绘制二十面体。
void auxWireOctahedron(GLdouble radius) |
绘制八面体。
void auxWireTetrahedron(GLdouble radius) |
绘制四面体。
void auxWireDodecahedron(GLdouble radius) |
绘制十二面体。
void auxWireCone(GLdouble radius,GLdouble height) |
绘制圆锥。
void auxWireTeapot(GLdouble size) |
绘制茶壶。
以上物体均以各自中心为原点绘制,所有坐标都已单位化,可以缩放。
5.背景过程管理。
void auxIdleFunc(void *func) |
定义空闲状态执行函数。参数 func 是一个指针,指向所要执行的函数功能。当它为零时,func 执行无效。
6.程序运行。
void auxMainLoop(void(*displayFunc)(void)) |
定义场景绘制循环函数。displayFunc 指针指向场景绘制函数。当窗口需要更新或场景发生改变时,程序便调用它所指的函数,重新绘制场景。
The Why·Liam·Blog by WhyLiam is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由WhyLiam创作并维护的Why·Liam·Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Why·Liam·Blog (https://blog.naaln.com),版权所有,侵权必究。
本文永久链接:https://blog.naaln.com/2013/04/basic-of-opengl-auxiliary-library/