Freeglut
glut是opengl实用工具集,由Mark Kilgrad所写。可以用来显示窗体,管理用户输入,字体,图像等操作,现在已经停止维护了,它的3.7版本是苹果电脑操作系统Mac OS 10.8(又名“美洲狮”)的opengl实用工具库的框架基础
使用更新的Freeglut替代glut,Freeglut是由Pawel W.Olszta编写
glut使我们创建opengl程序更加的简单,我们只需要四步就能够创造出opengl程序
1.初始化glut库
2.创建glut窗口
3.注册display()回调函数
4.进入glut的主循环
Freeglut官网
https://freeglut.sourceforge.net/index.php#download

它的windows二进制版下载地址,可以下载msvc或者mingw版本的库文件
https://www.transmissionzero.co.uk/software/freeglut-devel/

下载后解压到文件夹D:\libs\freeglut
对于mingw版freeglut,gcc的编译链接参数-ID:\libs\freeglut\include -LD:\libs\freeglut\lib -lfreeglut
glew
不同的操作系统编译链接和运行opengl程序用到的库是不同的,为了解决这个问题,每个支持opengl的操作系统都具备在运行时获取函数指针的机制,glut提取窗口的特定函数,即glutGetProcAddress(),当调用它时会返回特定函数的地址
void (*GLUTproc)() glutGetProcAddress(const char *procName);
检索和procName相关的函数地址,或者当procName命名的函数不支持在opengl实现时,返回NULL
但是在实际程序中,可能并不会使用glutGetProcAddress()函数,而是使用glew库,他会更加深入的提取繁琐的函数指针,这样你只需要专心编写opengl程序就可以了
glew来自于Milan Ikits和Marcelo Magallon编写的第三方库OpenGL Extension Wranger。是一个跨平台的opengl c++扩展库,它会自动识别平台所支持的opengl高级扩展函数,只需包含一个glew.h头文件,你就能使用gl、glu、glext、wgl、glx的全部函数
下载地址
https://glew.sourceforge.net/basic.html

glew的windows二进制版本只有msvc版的库文件,而没有mingw版本的。可以下载源码重新编译mingw版本的库,可以参考我写过的文章
将glew库解压放到任意文件夹,如放到d:\libs\glew
glew库gcc的编译链接参数-ID:\libs\glew\include -LD:\libs\glew\lib -lglew32
OpenGL程序编写
编写显示一个矩形和点的opengl窗体
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <stdio.h>
//调整窗口大小回调函数
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
}
//显示回调函数
void display(void)
{
//设置清除颜色
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
//使用glClearColor设置的色擦除背景
glClear(GL_COLOR_BUFFER_BIT);
//设置颜色
glColor3f(1.0f, 1.0f, 0.0f);
//glBegin(GL_POINTS); // 绘制点
//glBegin(GL_LINES); // 绘制线
//glBegin(GL_LINE_STRIP);// 绘制前后连接的点组成的线
//glBegin(GL_LINE_LOOP); // 绘制前后连接的点组成的线 , 并且首尾相连
//glBegin(GL_TRIANGLES); // 绘制多个三角形
//glBegin(GL_TRIANGLE_STRIP); // 绘制 GL_TRIANGLE_STRIP 三角形
//glBegin(GL_TRIANGLE_FAN); // 绘制三角形扇
//绘制凸多边形
glBegin(GL_POLYGON);
glVertex2f(-0.5f, -0.5f);
glVertex2f(-0.5f, 0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.5f, -0.5f);
//结束绘制
glEnd();
//设置颜色
glColor3f(1.0f, 0.0f, 0.0f);
//设置点大小
glPointSize(10);
//开始绘制点
glBegin(GL_POINTS);
glVertex2f(0.5f, 0.5f);
glVertex2i(0, 0);
//结束绘制
glEnd();
glFlush();//单缓冲使用的刷新函数
//glutSwapBuffers();//双缓冲使用的刷新函数
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);//初始化glut库
glutInitDisplayMode(GLUT_RGBA| GLUT_SINGLE);//窗口显示模式 单缓冲模式
//glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE);//双缓冲模式
glutInitWindowPosition(200, 200);//窗体位置
glutInitWindowSize(400, 400);//窗体大小
glutCreateWindow("OpenGL demo");//创建一个具有之前设置特性的窗体,该窗体在进入glutMainLoop()函数之前不会显示
//初始化glew
GLenum err = glewInit();
if (GLEW_OK != err)
{
fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
return 0;
}
//设置窗体调整大小回调函数
glutReshapeFunc(reshape);
//显示回调函数
glutDisplayFunc(display);
//glut主循环
glutMainLoop();//glut事件处理循环,它永远不会返回,当对应事件发生,为该事件注册的回调函数会被调用
return 0;
}
在主函数最后的glutMainLoop()类似win32窗体程序最后的消息循环。都是循环处理窗体消息,并保证程序不会结束。
使用mingw gcc编译链接
g++ TestOpengl.cpp -ID:\libs\freeglut\include -ID:\libs\glew\include -LD:\libs\freeglut\lib -LD:\libs\glew\lib -lopengl32 -lfreeglut -lglew32
