OpenGL实践之--窗口创建
作为一个图形接口的OpenGL在使用严重依赖窗口,必须在窗口中绘制图形,但是自身并没有包含窗口及其相关内容。因此,学习OpenGL就必须了解一种窗口系统,不同的操作系统提供的创建窗口的API都不相同,为了避免学习OpenGL时必须去学习一整套的窗口系统的不便,简单应用可以使用GLUT(OpenGL Utility Toolkit),是一套和窗口系统无关的软件包,提供了窗口创建及用户输入输出等功能。但GLUT并不是一个功能特别全面的窗口系统工具包,在构建大型复杂应用时还是需要根据需求选择相应的窗口系统工具包。freeglut随着opengl的发展而保持更新,以下使用freeglut,没有使用原生的glut。
GLUT的基本流程包括四步:
1)初始化GLUT库;
2)创建GLUT窗口;
3)注册display()回调函数;
4)进入GLUT主循环;
glut初始化
在使用glut之前,一定要初始化glut库。函数原型为:
void glutInit(int argc,char **argv);
接下来可设置glut的一些属性。
配置显示特性
void glutInitDisplayMode(unsigned int mode);
mode 默认为GLUT_INDEX\GLUT_SINGLE、GLUT_DEPTH的按位组合。
配置OpenGL版本
void glutInitContextVersion(int majorVersion, int minorVersion);
配置创建的上下文信息
void glutInitContextProfile(int profile)
core版本:GLUT_CORE_PROFILE;
兼容性版本:GLUT_COMPATIBILITY_PROFILE;
创建窗口
int glutCreateWindow(char* name);
设置窗口位置和大小
void glutInitWindowSize(int width,int height);
void glutInitWindowPosition(int x, int y);
设置渲染函数
void glutDisplayFunc(void (*func)(void));
窗口变化回调函数
void glutReshapeFunc(void (*func)(int width, int height));
键盘按键事件监听
void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y));
void glutKeyboardUpFunc(void (*func)(unsigned char key, int x, int y));
鼠标事件监听
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));//鼠标指针在窗口内移动
窗口重绘标记
void glutPostRedisplay(void);标记窗口需要重绘,在下一次的执行过程中,将调用渲染函数。
背景管理
void glutIdleFunc(void (*func)(void));//当没有其它事件需要处理时的时候调用func,典型应用如动画
事件循环
void glutMainLoop();//永远不会返回