OpenGL是图形硬件的一种软件接口,这个接口包含函数超过700个左右,这些函数用于指定物体和操作,创建交互式三维应用程序。
OpenGL图形系统的功能非常强大,程序相当复杂,但是许多实用的OpenGL的基本程序结构可能比较简单,主要任务是就是初始化一些状态,并制定需要渲染的物体。
GLUT函数库
窗口管理
glutInit对GLUT进行初始化,并处理所有命令行参数,在其他glut函数之前调用
glutInitDisplayMode 指定了是使用RGBA模式还是颜色索引模式,另外还可以指定是使用单缓冲还是双缓冲窗口
gluInitWindowPosition 指定窗口左上角屏幕位置
glutInitWindowSize 指定窗口大小
glutInitContextVersion 声明使用OpenGL版本
glutInitContextFlags 声明想要使用OpenGL渲染环境类型
int glutCreateWindow(char *string) 创建只一个支持OpenGL渲染环境的窗口。在调用glutMainLoop函数之前 该窗口并没有显示
显示回调函数
glutDisplayFunc是回调函数,每当GLUT确定一个窗口的内容需要重新显示时候,通过该方法注册的那个回调函数就会被执行,因此绘制场景代码应放在显示回调函数里面。
运行程序
调用glutMainLoop方法启动程序。一旦进入循环永远不退出
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glBegin(GL_POLYGON);
glVertex3f(0.25,0.25,0.0);
glVertex3f(0.75,0.25,0.0);
glVertex3f(0.75,0.75,0.0);
glVertex3f(0.25,0.75,0.0);
glEnd();
glFlush();
}
void Init()
{
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}
int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc,(char**)argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(250,250);
glutCreateWindow("OpenGL Program");
Init();
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
static GLfloat spin = 0.0;
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin,0.0,0.0,1.0);
glColor3f(1.0,1.0,1.0);
glRectf(-25.0,-25.0,25.0,25.0);
glPopMatrix();
glutSwapBuffers();
}
void SpinDisplay()
{
spin = spin+2.0;
if(spin>360.0)
spin = spin-360.0;
glutPostRedisplay();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-50.0,50.0,-50.0,50.0,-1.0,1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_LEFT_BUTTON:
if(state==GLUT_DOWN)
glutIdleFunc(SpinDisplay);
break;
case GLUT_MIDDLE_BUTTON:
if(state==GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
void Init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc,(char**)argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(250,250);
glutCreateWindow("OpenGL Program");
Init();
glutDisplayFunc(&myDisplay);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
“`
处理输入事件
当指定事件发生时候,以下函数便会被调用
glutReshapeFunc 表示当窗口的大小发生改变时候应该采取什么行动
glutKeyboardFunc 和 glutMouseFunc 当键或者按钮按下或者释放函数就会调用
glutMotionFunc 注册一个函数 按下一个鼠标按钮移动鼠标时候 函数调用
空闲处理
glutIdleFunc 如果不存在其它未完成的事件 就执行这个函数 向他传递NULL就相当于禁用
GLUT包含一些函数可以用来绘制三维物体