/* OpenGL包含了许多渲染函数,但是的设计目的是独立于任何窗口系统或操作系统,因此它并没有打开窗口或从键盘或鼠标读取事件的函数。
可以使用GLUT,GLUT还包含了一些函数,用于创建更为复杂的三维物体,如球体,圆环面和茶壶。
若要编写功能完整的OpenGL应用程序,GLUT可能无法满足要求,但是GLUT可以作为学习OpenGL非常好的起点。 */
窗口管理:
GLUT 通过几个函数执行初始化窗口所需要的任务:
* glutInit(int *argc, char **argv) 对GLUT进行初始化,并处理所有的命令行参数。在调用其他任何GLUT函数之前调用。
* glutInitDisplayMode(unsigned int mode) 指定了使用RGBA模式还是颜色索引模式.若使用颜色索引,需用glutSetColor()
把颜色加载到颜色映射表中。eg:glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
* glutInitWindowPosition(int x,int y) 指定了窗口左上角的屏幕位置
* glutInitWindowSize(int width,int size) 指定了窗口的大小
* glutInitContextVersion(int majorVersion,int minorVersion) 声明使用OpenGL的哪个版本
* glutInitContextFlags(int flags) 声明使用的OpenGL渲染环境的类型
* int glutCreateWindow(char *string) 创建一个支持OpenGL渲染环境的窗口,返回一个唯一的标示符,表示这个窗口。
在调用glutMainLoop()函数之前,这个窗口并没有显示。
最重要的事件回调函数:
glutDisplayFunc(void (*func)(void)), 每当GLUT确定一个窗口的内容需要重新显示时,通过glutDisplayFunc()注册的回调函数就会运行
如果程序修改了窗口的内容,有时可能需要调用glutPostRedisplay(),这个函数会指示glutMainLoop()调用已注册的显示回调函数。
运行程序:
必须调用glutMainLoop()来启动程序,所有已创建的窗口将会在这时显示,对窗口渲染开始生效,事件处理循环开始启动,已注册的显示回调函数
被触发,一旦进入循环,永不会退出。
//使用GLUT的OpenGL示例:hello.c
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
void display(void){
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(void){
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 main(int argc,char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(250,250);
glutInitWindowPosition(100,100);
glutCreateWindow("hello");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
处理输入事件:
* glutReshapeFunc(void(*func)(int w,int h))表示当窗口的大小改变时应该采取什么行动;
* glutKeyboardFunc(void(*func)(unsigned char key,int x, int y))和
* glutMouseFunc(void(*func)(int button,int state,int x,int y)) 允许把键盘上的一个键或鼠标上的一个按钮与一个函数
相关联,当键或按钮被按下或吃放时,这个函数就会被调用。
* glutMotionFunc(void(*func)(int x, int y)) 当按下一个鼠标按钮移动鼠标时,函数被调用。
空闲处理:
在glutIdleFunc(void(*func)(void))回调函数中指定一个函数,若不存在其他尚未完成的事件就执行这个函数;若传递NULL,表示禁用此函数。