一.简介
FreeGlut是Glut的开源版本
二.配置FreeGlut
1.使用cmake
cmake(cross platform make)是一个跨平台的安装(编译)工具
三.初始化
1.窗口管理函数
glutInit(int* argc, char** argv) // 窗口初始化
glutInitDisplayMode(unsigned int mode) // 窗口属性
glutInitWindowPosition(int x,int y) // 窗口位置
glutInitWindowSize(int width, int size) // 窗口大小
glutInitContextVersion(int majorVersion, int minorVersion) // 窗口版本
glutInitContextFlags(int flags) //
glutCreateWindow(char* string) // 创建窗口
2.事件响应函数
glutIdleFunc(void(*func) (void)) // 空闲回调函数
glutDisplayFunc() // 绘制回调函数
glutReshapeFunc() // 重绘回调函数
glutMouseFunc() // 鼠标回调函数
3.消息循环
glutMainLoop()
4.绘制函数
glutSwapBuffers() // 交换缓存进行重新绘制glutPostRedisplay() // 发送重绘消息
glutGetProcAddress()
四.示例
1.
#include <GL/freeglut.h>
//////////////////////////////////////////////////////
// 渲染场景
void display(void)
{
glutSwapBuffers(); //双缓存
}
//////////////////////////////////////////////////////
// 重绘窗口
void reshape(int w, int h)
{
}
//////////////////////////////////////////////////////
// 键盘事件
void keyboard(unsigned char key, int x, int y)
{
glutPostRedisplay(); // 发送消息重绘
}
//////////////////////////////////////////////////////
// 主程序入口
int main(int argc, char** argv)
{
// 初始化
glutInit(&argc, argv);
// 显示模式(单缓存 | RGB颜色)
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
// 调整窗口大小和位置
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
// 创建窗口
glutCreateWindow("GLUT");
// 重绘回调函数
glutReshapeFunc(reshape);
// 键盘回调函数
glutKeyboardFunc(keyboard);
// 鼠标回调函数
//glutMotionFunc(mouse);
// 渲染回调函数
glutDisplayFunc(display);
// OpenGL检测
const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
const GLubyte* gluVersion = gluGetString(GLU_VERSION); //返回当前GLU工具库版本
printf("OpenGL实现厂商的名字:%s ", name);
printf("渲染器标识符:%s ", biaoshifu);
printf("OpenGL实现的版本号:%s ", OpenGLVersion);
printf("OGLU工具库版本:%s ", gluVersion);
// 处理消息循环
glutMainLoop();
//system("pause");
return 0;
}
//////////////////////////////////////////////////////
// 渲染场景
void display(void)
{
glutSwapBuffers(); //双缓存
}
//////////////////////////////////////////////////////
// 重绘窗口
void reshape(int w, int h)
{
}
//////////////////////////////////////////////////////
// 键盘事件
void keyboard(unsigned char key, int x, int y)
{
glutPostRedisplay(); // 发送消息重绘
}
//////////////////////////////////////////////////////
// 主程序入口
int main(int argc, char** argv)
{
// 初始化
glutInit(&argc, argv);
// 显示模式(单缓存 | RGB颜色)
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
// 调整窗口大小和位置
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
// 创建窗口
glutCreateWindow("GLUT");
// 重绘回调函数
glutReshapeFunc(reshape);
// 键盘回调函数
glutKeyboardFunc(keyboard);
// 鼠标回调函数
//glutMotionFunc(mouse);
// 渲染回调函数
glutDisplayFunc(display);
// OpenGL检测
const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
const GLubyte* gluVersion = gluGetString(GLU_VERSION); //返回当前GLU工具库版本
printf("OpenGL实现厂商的名字:%s ", name);
printf("渲染器标识符:%s ", biaoshifu);
printf("OpenGL实现的版本号:%s ", OpenGLVersion);
printf("OGLU工具库版本:%s ", gluVersion);
// 处理消息循环
glutMainLoop();
//system("pause");
return 0;
}
2.
鼠标按下矩形旋转
#include <stdio.h> #include <GL/freeglut.h> static GLfloat spin = 0.0; void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); } void display(void) { 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(void) { 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; } } ////////////////////////////////////////////////////// // 主程序入口 int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; }