windows系统使用Freeglut,glew库编写opengl程序(Mingw)

⌚Time: 2023-02-01 13:15:46

👨‍💻Author: Jack Ge

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