一.简介
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\n", name);
printf("渲染器标识符:%s\n", biaoshifu);
printf("OpenGL实现的版本号:%s\n", OpenGLVersion);
printf("OGLU工具库版本:%s\n", 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;
}