从零开始学习OpenGL(3) GLUT辅助库常用函数介绍

对于OpenGL的开发来说,GLUT是一个很方便的辅助库,而且与平台无关。

GLUT的功能包括窗口和菜单的创建和管理,事件处理以及提供了很多绘制3D图形的方法等等。

常用的函数如下:

glutInitWindowSize(int width,int height)  初始化窗口的大小
glutInitWindowPosition(int x,int y)   初始化窗口的坐标
glutCreateWindow(const char* title)    创建窗口
glutDisplayFunc(void (*func)(void))     屏幕刷新时调用的函数,这个只会在创建窗口,缩放窗口等情况下执行
glutReshapeFunc(void (*func)(void))     处理窗口大小改变的消息
glutIdleFunc(void (*func)(void))        系统空闲的时候执行(在拖动窗口,缩放窗口等事件处理的时候不执行)
glutTimerFunc(unsigned int mills,void (*func)(void),int value)   定时器,在mills毫秒后执行,但是只执行一次函数。所以想让他定时执行,需要在函数的结尾重新调用glutTimerFunc。
glutMouseFunc(void (*func)(int button, int state, int x, int y)) 鼠标事件输入,state表示状态,button表示左右按键
glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))  键盘事件输入,key表示按键的ASCII码
glutMainLoop()   进入GLUT事件循环

下面我们来看一个例子:

#include <gl\glut.h>
float z = 20.0;
float sub = 0.1;

void Render()
{
	glClearColor(0.0f,0.0f,0.0f,1.0f);
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(0.5,0.5,0.5);
	glLoadIdentity();
	gluLookAt(0.0,0.0,z, 0.0,0.0,0.0, 0.0,1.0,0.0);
	glScalef(1.0,2.0,1.0);
	glutWireCube(1.0);
	glFlush();
}

void Update(int value)
{
	z -=sub;
	if(z < 5.0 || z > 20.0){
		sub = -sub;
	}
	glutPostRedisplay();
	glutTimerFunc(20,Update,0);
}

void ReShape(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
	glMatrixMode(GL_MODELVIEW);
}

int main(int arg, char** argv){
	glutInitWindowSize(600,600);
	glutInitWindowPosition(420,150);
	glutCreateWindow("My OpenGL Window");
	glutDisplayFunc(Render);
	glutReshapeFunc(ReShape);
	glutTimerFunc(20,Update,0);
	glutMainLoop();
}

示例的内容很简单,在glutDisplayFunc中定义绘制的内容,主要是一个线框的立方体。然后通过glutTimerFunc定时器,来不停的更改视图矩阵的相机位置,前进后退。在glutTimerFunc中,通过glutPostRedisplay来刷新绘图。

效果图如下:

另外补充一点,由于原始的GLUT库不被维护,所以大家可以使用freeglut库,内容差不多,有一些补充和修改。

发表评论

电子邮件地址不会被公开。