嗯,这个东西非常轻量化,如果希望写一些 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 的实现有很多免费的版本,如
freeglut,
OpenGLUT。而 OpenGL 本身也有一个开源的实现,即
mesa,想看源代码,可能更多的应该是 GLU,毕竟 GLUT 提供的主要是窗口操作方面的东西。写轻量级的 OpenGL 程序比较合适。