Friday, October 22, 2010

OpenGL Utility Toolkit 使用指南

嗯,这个东西非常轻量化,如果希望写一些 OpenGL 的测试程序非常合适。OpenGL Utility Toolkit 简称 GLUT,虽然并不是开源软件,但是多数平台下面都有,并且接口一致简洁。这里有它的主页,上面有文档和源代码。

初始化

void glutInit( int argc, char* argv[] ) ;
用于初始化 glut 程序,会处理一些相关的选项。

void glutInitWindowSize( int width, int height ) ;
void glutInitWindowPosition( int x, int y ) ;
初始化窗口的大小和位置。

void glutInitDisplayMode( unsigned int mode ) ;
支持 GLUT_ 系模式,主要是设置颜色支持,打不打开各种 buffer;

事件处理

void glutMainLoop( void ) ;
事件循环。

窗口管理

int glutCreateWindow( char* name ) ;
创建窗口,返回窗口编号;

int glutCreateSubWindow( int win,
    int x, int y, int width, int height ) ;
在给定窗口内,创建子窗口。

void glutSetWindow( int win ) ;
int glutGetWindow( void ) ;
选择或者获得当前(用于做图的)窗口;

void glutDestroyWindow( int win ) ;
释放窗口;

void glutPostRedisplay( void ) ;
要求重绘当前窗口;

void glutSwapBuffer( void ) ;
如果当前窗口使用了 double buffering 就进行 buffer 交换;

void glutPositionWindow( int x, int y ) ;
重新放置当前窗口;

void glutReshapeWindow( int width, int height ) ;
改变当前窗口大小;

void glutFullScreen( void ) ;
将当前窗口切换到全屏;

void glutFullScreen( void ) ;
切换到全屏。

void glutPushWindow( void ) ;
void glutPushWindow( void ) ;
改变 window 堆积的顺序。

void glutShowWindow( void ) ;
void glutHideWindow( void ) ;
void glutIconifyWindow( void ) ;
显示、隐藏与最小化窗口。

void glutSetWindowTitle( char* name ) ;
void glutSetIconTitle( char* name ) ;
设定窗口和图标的标题。

void glutSetCursor( int cursor ) ;
设定鼠标形状;

overlay 管理

所谓的 overlay 指在 OpenGL 窗口上覆盖的另一个 OpenGL 绘制区域。

void glutEstablishOverlay( void ) ;
在当前窗口上创建 overlay;

void glutUseOverlay( GLenum ) ;
设定使用原始窗口(GL_NORMAL)还是 overlay(GL_OVERLAY);

void glutRemoveOverlay( void ) ;
移除所创建的 overlay;

void glutPostOverlayRedisplay( void ) ;
重绘 overlay。

void glutShowOverlay( void ) ;
void glutHideOverlay( void ) ;
现实或者隐藏 overlay;

菜单管理

int glutCreateMenu( void (*func)(int val) ) ;
创建菜单,使用的 callback 函数在菜单被点击后会调用,传入的是所点的菜单项。返回菜单 id;

void glutSetMenu( int menu ) ;
int glutGetMenu(void) ;
设定 menu 以及获得使用的 menu 编号;

void glutDestroyMenu( void ) ;
析构 menu 对象。

void glutAddMenuEntry( char* name, int value ) ;
void glutAddSubMenu( char* name, int value ) ;
添加(子)菜单项。

void glutChangeToMenuEntry( int entry, char* name, int index ) ;
void glutChangeToSubMenuEntry( int entry, char* name, int index ) ;
设定(子)菜单的新的索引值(传递给 callback 函数用的);

void glutRemoveMenuItem( int entry ) ;
删掉菜单项。

void glutAttachMenu( int button ) ;
void glutDetachMenu( int button ) ;
将按钮关联到菜单。

注册 callback 函数

void glutDisplayFunc( void (*func)(void) ) ;
用于绘制窗口的 callback 函数。一般会把所有的画图部分放在这个函数里面,通过几个参数控制最后的行为。

void glutOverlayDisplayFunc( void (*func)(void) ) ;
设定 overlay 的绘图过程。

void glutReshapeFunc( void (*func)( int width, int height) ) ;
设定窗口大小改变后的行为。

void glutKeyboardFunc( void (*func)(unsigned char key, int x, int y) ) ;
设定响应键盘的 callback 函数。

void glutMouseFunc( void (*func)(int button, int state, int x, int y) ) ;
设定响应鼠标的函数。

void glutMotionFunc( void (*func)(int x, int y) ) ;
void glutPassiveMotionFunc( void (*func)(int x, int y) ) ;
设定响应鼠标按下后行为与一般移动行为的 callback 函数。

void glutEntryFunc( void (*func)( int state) ) ;
鼠标进入、退出窗口时触发;

void glutSpecialFunc( void (*func)(int key, int x, int y) ) ;
响应特殊按键;

void glutSpaceballMotionFunc( void (*func)(int x, int y, int z) ) ;
void glutSpaceballRotateFunc( void (*func)(int x, int y, int z) ) ;
void glutSpaceballButtonFunc( void (*func)(int button, int state ) ) ;
滚动球的移动、旋转和点击行为;

void glutButtonBoxFunc( void (*func)(int button, int state) ) ;
点击按钮的行为;

void glutDialsFunc( void (*func)(int dial, int value) ) ;
设置 dial 和 button 的行为。

void glutTabletMotionFunc( void (*func)( int x, int y) ) ;
void glutTabletButtonFunc( void (*func)( int button, int state, int x, int y) ) ;
设置响应平板操作的函数;

void glutMenuStatusFunc( void (*func)(int status, int x, int y) ) ;
void glutMenuStateFunc( void (*func)(int status) ) ;
设置菜单的行为;

void glutIdleFunc( void (*func)(void) ) ;
如果无事可做就会被调用的 callback 函数;

void glutTimerFunc( unsigned int msecs, void (*func)(int value), int value ) ;
设定计时器;

色彩索引管理

通过 glutGet( GLUT_WINDOW_COLORMAP_SIZE ) 可以获得可使用的 pallete 大小,之后可以用
void glutSetColor( int cell, GLfloat r, GLfloat g, GLfloat b ) ;
GLfloat glutGetColor( int cell, int component ) ;
设定或者获得每个调色板的颜色;

void glutCopyColormap( int win ) ;
可以复制指定窗口的 colormap;

状态获得

可以用
void glutGet( GLenum state ) ;
获得需要的状态;

void glutLayerGet( GLenum info ) ;
获得当前 layer 的信息;

void glutDeviceGet( GLenum info ) ;
获得设备相关信息;

void glutGetModifiers( void ) ;
获得 shift、ctrl 和 alt 的状态;

void glutExtensionSupported( char* extentsion ) ;
返回某些 OpenGL 扩展是否被支持;

字体支持

void glutBitmapCharacter( void* font, int chararacter ) ;
字体中某个字符的 OpenGL 渲染;

int glutBitmapWidth( GLUTbitmapFont font, int chararacter ) ;
返回字体宽度;

void glutStrokeCharacter( void* font, int chararacter ) ;
使用轮廓字体;

int glutBitmapWidth( GLUTstrokeFont font, int chararacter ) ;
返回轮廓字体宽度;

几何体的渲染

这也是我需要好生研究一下 src code 的部分。

void glutSolidSphere( GLdouble radius, GLint slices, GLint stacks ) ;
void glutWireSphere( GLdouble radius, GLint slices, GLint stacks ) ;
画球;

void glutSolidCube( GLdouble size ) ;
void glutWireCube( GLdouble size ) ;
画正方体;

void glutSolidCone( GLdouble base, GLdouble height, GLint slices, GLint stacks ) ;
void glutWireCone( GLdouble base, GLdouble height, GLint slices, GLint stacks ) ;
锥体,base 设定的是底面圆的半径;

void glutSolidTorus( GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings ) ;
void glutWireTorus( GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings ) ;
圆环;

void glutSolidDodecahedron( void ) ;
void glutWireDodecahedron( void ) ;
正 12 面体,每个面是五边形;

void glutSolidOctahedron( void ) ;
void glutWireOctahedron( void ) ;
正八面体,每个面是三角形;

void glutSolidTetrahedron( void ) ;
void glutWireTetrahedron( void ) ;
正四面体,每个面是三角形;

void glutSolidIcosahedron( void ) ;
void glutWireIcosahedron( void ) ;
二十面体;

void glutSolidTeapot( GLdouble size ) ;
void glutWireTeapot( GLdouble size ) ;
茶壶;

其他内容

其实 GLUT 的实现有很多免费的版本,如 freeglutOpenGLUT。而 OpenGL 本身也有一个开源的实现,即 mesa,想看源代码,可能更多的应该是 GLU,毕竟 GLUT 提供的主要是窗口操作方面的东西。写轻量级的 OpenGL 程序比较合适。

No comments: