GLUT/freeglut 是什么? OpenGL 和它们有什么关系?

OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用。如果需要在程序里直接使用OpenGL,会有很多非常恶心的预备工作要做,而且可能还要专门为平台的差异写一些代码。要跳过这些工作,可以用一个utility库,直接使用它提供的函数,就不用操心那些细节了。这样的库新一点的有GLEW,因为开源所以安装相对方便(大不了丢进去一起编译),但各种教程和书里常见的是闭源的GLUT。由于GLUT的作者已经很久没更新过了(最后更新于2000年!= =),所以其他人另外做了一个接口兼容GLUT的freeglut,开源而且一直在维护中。

这篇文章介绍了怎样在 Linux(Ubuntu)和 Windows 下安装 GLUT/freeglut,以及如何编写能够跨平台编译的 Makefile 和代码。在 Windows 下可以安装 GLUT 或者 freeglut 其中的一个,不过建议安装后者。在 Ubuntu 下安装 freeglut即可。

Linux 下安装

Linux 下一般使用开源的 freeglut,安装相对于 windows 比较方便,比如 Ubuntu 下安装只要一行命令:

$ sudo apt-get install build-essential freeglut3 freeglut3-dev binutils-gold

Windows 下安装

在 Windows 下如果不使用 Visual Studio 系的环境,可以用 *nix 的命令行工具在 Windows 下的移植版,通常使用的是 mingw 系列套装。

建议直接使用 mingw 的包管理器下载安装需要的包,如果要像这篇文章一样能够用
g++ 和 Make 编译,最好安装 g++(gcc)、GNU Make 和 *nix 常用命令行工具的移植版,也就是在 mingw 的包管理器里选择安装 mingw-developer-toolkitmingw32-basemingw32-gcc-g++ 和 msys-base

关于如何在 Windows 下安装 mingw 环境,这里不赘述,可以参考这个链接。安装完之后需要记得将 mingw/bin 和 mingw/msys/版本号/bin 加入 PATH 环境变量。设置完环境变量后打开
cmd(如果设置前已经打开了,需要关掉再开或者另开一个cmd),如果运行 make
--version
g++
--version
 和 bash
--version
 可以看到相关的版本信息,就说明安装成功了,比如:

C:\Users\Administrator> make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. C:\Users\Administrator> g++ --version
g++ (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. C:\Users\Administrator>bash --version
GNU bash, version 3.1.23(1)-release (i686-pc-msys)
Copyright (C) 2005 Free Software Foundation, Inc.

1. 下载 GLUT/freeglut

如果安装 GLUT,地址在:https://user.xmission.com/~nate/glut.html,下载 glut-3.7.6-bin.zip(已经十几年没更新过了所以就是这个版本了2333)

freeglut 在地址:http://www.transmissionzero.co.uk/software/freeglut-devel/ ,点击
Download freeglut 2.8.1-1 for MinGW

2. 放置头文件和库文件(GLUT)

解压下载到的zip,里面就是相关的头文件和库文件了。

对于 GLUT 而言,因为glut.dll 是32位的,所以在64位系统下放在C:\Windows\SysWOW64,32位系统下放在C:\Windows\System32。另外无论系统直接放在C:\Windows也可以。glut.h 放到mingw/include/GL,glut32.lib 放到mingw/lib。

比如一个64位系统的mingw安装在D:/mingw,GLUT 放完之后大概是这样:

C:\Windows\SysWOW64
└─ glut.dll
D:\mingw
├─ include
│ └─ GL
│ └─ glut.h
└─ lib
└─ glut32.lib

2. 放置头文件和库文件(freeglut)

放置如下,因为mingw如果不用64位的port(mingw-w64)的话只有32位,所以这里使用32位的文件。

C:\Windows\SysWOW64
└─ freeglut.dll (32位的mingw就用bin目录下那个,不是bin/x64那个)
D:\mingw
├─ include
│ └─ GL
│ ├─ freeglut.h
│ ├─ freeglut_ext.h
│ ├─ freeglut_std.h
│ └─ glut.h (注意这个和老版的glut.h不同)
└─ lib
├─ libfreeglut.a (这两个同样用lib目录下的两个)
└─ libfreeglut_static.a

一般操作系统会自带 glu32.dll, mingw 在安装的时候就会带上一些头文件在 include/GL,lib 里也有opengl和glu的库文件,看到不需要奇怪。

如果熟悉自己的工具,更喜欢自己编译连接时指定库文件和头文件位置,这一步可以跳过,放在自己觉得合适的地方,只要在工程/Makefile声明路径即可。

配置编译/链接参数

GLUT

  • 编译参数需要加上加-DGLUT_DISABLE_ATEXIT_HACK(也可以在代码里#define
    GLUT_DISABLE_ATEXIT_HACK
  • 链接参数加上-lopengl32
    -lglu32 -lglut32

freeglut (Windows)

  • 不需要特别的编译参数
  • 链接参数为-lfreeglut
    -lopengl32 -Wl,--subsystem,windows。

freeglut (Linux)

  • 不需要特别的编译参数
  • 链接参数为-lGL
    -lglut。

mingw 本身就是 32 位,所以不需要特别设置。如果是用的 mingw-w64,还需要在参数里加上 -m32

代码里使用头文件

在 windows 下使用 GLUT 的函数前需要引用以下两个头文件

#include <windows.h>
#include <GL/glut.h>

顺序不能反。一般教程或者样例代码里如果不是针对win32平台不会有#include
<windows.h>
,很多东西的定义就找不到了,所以跑之前要检查。如果要自动检测操作系统的话进行条件编译的话,就是这样

#if defined(_WIN32) || defined(WIN32)
#include <windows.h>
#endif

例子

Makefile

如果用的是使用 mingw 的 IDE,只要记得在里面配置步骤 3 的参数即可(一般在project或者build之类的选项里)。

GLUT 使用的 Makefile

LDFLAGS=-lopengl32 -lglu32 -lglut32
CFLAGS=-g -DDEBUG -DGLUT_DISABLE_ATEXIT_HACK
all:
g++ main.cpp -c -o main.o $(CFLAGS)
g++ main.o $(LDFLAGS) -o main.exe clean:
rm main.o main.exe

freeglut 使用的 Makefile

LDFLAGS=-lfreeglut -lopengl32 -Wl,--subsystem,windows
CFLAGS=-g -DDEBUG all:
g++ main.cpp -c -o main.o $(CFLAGS)
g++ main.o $(LDFLAGS) -o main.exe clean:
rm main.o main.exe

使用freeglut,跨平台支持的 Makefile

ifeq ($(OS),Windows_NT)
LDFLAGS=-lfreeglut -lopengl32 -Wl,--subsystem,windows
EXECUTABLE=main.exe
else
LDFLAGS=-lGL -lglut
EXECUTABLE=main
endif CFLAGS=-g -DDEBUG all:
g++ main.cpp -c -o main.o $(CFLAGS)
g++ main.o $(LDFLAGS) -o $(EXECUTABLE) clean:
rm main.o $(EXECUTABLE)

程序main.cpp,来自OpenGL
Code Samples
,注意windows下要添加 windows.h:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(_WIN32) || defined(WIN32)
#include <windows.h>
#endif

#include <GL/glut.h> GLenum doubleBuffer;
GLint thing1, thing2; static void Init(void)
{ glClearColor(0.0, 0.0, 0.0, 0.0);
glClearAccum(0.0, 0.0, 0.0, 0.0); thing1 = glGenLists(1);
glNewList(thing1, GL_COMPILE);
glColor3f(1.0, 0.0, 0.0);
glRectf(-1.0, -1.0, 1.0, 0.0);
glEndList(); thing2 = glGenLists(1);
glNewList(thing2, GL_COMPILE);
glColor3f(0.0, 1.0, 0.0);
glRectf(0.0, -1.0, 1.0, 1.0);
glEndList();
} static void Reshape(int width, int height)
{ glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} static void Key(unsigned char key, int x, int y)
{ switch (key) {
case '1':
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glutPostRedisplay();
break;
case '2':
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glutPostRedisplay();
break;
case 27:
exit(0);
}
} static void Draw(void)
{ glPushMatrix(); glScalef(0.8, 0.8, 1.0); glClear(GL_COLOR_BUFFER_BIT);
glCallList(thing1);
glAccum(GL_LOAD, 0.5); glClear(GL_COLOR_BUFFER_BIT);
glCallList(thing2);
glAccum(GL_ACCUM, 0.5); glAccum(GL_RETURN, 1.0); glPopMatrix(); if (doubleBuffer) {
glutSwapBuffers();
} else {
glFlush();
}
} static void Args(int argc, char **argv)
{
GLint i; doubleBuffer = GL_FALSE; for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-sb") == 0) {
doubleBuffer = GL_FALSE;
} else if (strcmp(argv[i], "-db") == 0) {
doubleBuffer = GL_TRUE;
}
}
} int main(int argc, char **argv)
{
GLenum type; glutInit(&argc, argv);
Args(argc, argv); type = GLUT_RGB | GLUT_ACCUM;
type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
glutInitDisplayMode(type);
glutInitWindowSize(300, 300);
glutCreateWindow("Accum Test"); Init(); glutReshapeFunc(Reshape);
glutKeyboardFunc(Key);
glutDisplayFunc(Draw);
glutMainLoop();
}

运行结果

Windows 下

Ubuntu 下

【OpenGL开发】GLUT/freeglut 是什么? OpenGL 和它们有什么关系?的更多相关文章

  1. 利用CodeBlocks结合freeglut快速搭建OpenGL开发环境

    利用CodeBlocks结合freeglut快速搭建OpenGL开发环境 2018-12-19 10:15:48 再次超越梦想 阅读数 180更多 分类专栏: 我的开发日记   版权声明:本文为博主原 ...

  2. 在Windows/Ubuntu下安装OpenGL环境(GLUT/freeglut)与跨平台编译(mingw/g++)

    GLUT/freeglut 是什么? OpenGL 和它们有什么关系? OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用.如果需要在程序里直接使用OpenGL, ...

  3. OpenGL开发环境配置-Windows/MinGW/Clion/CMake

    因为某些原因,不想用过于臃肿的VS了,转而使用常用的jetbrains的CLion,Clion沿袭了jetbrans的优良传统,基本代码提示功能还是比较好的,不过就是对于windows不熟悉cmake ...

  4. Fedora和Ubuntu下安装OpenGL开发环境配置

    Fedora下OpenGl开发环境配置 开发OpenGL工程需要3个库文件和对应的头文件: libglut.so,libGLU.so,libGL.so, gl.h ,glu.h, glut.h 这些库 ...

  5. 【游戏开发】基于VS2017的OpenGL开发环境搭建

    一.简介 最近,马三买了两本有关于“计算机图形学”的书籍,准备在工作之余鼓捣鼓捣图形学和OpenGL编程,提升自己的价值(奔着学完能涨一波工资去的).俗话说得好,“工欲善其事,必先利其器”.想学习图形 ...

  6. CentOS6.2 下安装OpenGL开发库

    在Linux下做Qt开发,结果运行程序的时候提示找不到GL/gl.h文件,所以只能先把OpenGL库安装上去,不知道这样操作对不对,以后再考虑吧,下面开始安装 1.查看mesa相关的包 yum lis ...

  7. OpenGL学习进程(2)OpenGL开发环境的搭建

        通过本节,我们来学习一下在Win10 64.VS1013环境下搭建OpenGL的开发环境.     (1)选择一个编译环境: 现在在windows中OpenGL的主流编译工具有Visual S ...

  8. VC 6中配置OpenGL开发环境

    2010,2012中配置类似 http://hi.baidu.com/yanzi52351/item/f9a600dffa4caa4ddcf9be1d VC 6中配置OpenGL开发环境 这里,我习惯 ...

  9. 计算机图形学——OpenGL开发库开发库

    vc++6.0 有 OpenGL 的东西.有头文件 GL.H, GLAUX.H, GLU.H 但没有 GLUT 软件包/工具包 如果想使用glut.h的话必须自己添加. 首先下载 OpenGL开发库, ...

随机推荐

  1. 【JS】知识笔记

    一.JS文件位置 多个.JS文件最好合并到一个文件中,减少加载页面时发送的请求数量. 某个单独页面需要的js,最好放在HTML文档的最后,</body>之前,这样能使浏览器更快地加载页面. ...

  2. source insight parse link

    source insight parse link \([a-zA-Z_]*\.[chCH]\) ([^)]*) line \([0-9][0-9]*\)

  3. 转载 | Python AI 教学│k-means聚类算法及应用

    关注我们的公众号哦!获取更多精彩哦! 1.问题导入 假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置.事先肯定要 ...

  4. 数据结构Java版之邻接表实现图(十)

    邻接表实现图,实际上是在一个数组里面存放链表,链表存放的是连接当前节点的其他节点. package mygraph; import java.util.ArrayList; import java.u ...

  5. 【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结

    大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩 ...

  6. Python在windows平台的多版本配置

    Python在windows平台的多版本配置 快速阅读: ​ python在windows平台的环境变量以及多版本配置 ,以及pycharm如何安装包,以及安装包出错时如何排查. 1.python环境 ...

  7. CheatEngine查看PE header

    先打开进程,炉石传说. 然后选择MemoryViewer 在MemoryViewer界面,Tools菜单,然后选择Dissect PE headers 然后查看mono.dll的信息 0x357A0是 ...

  8. windows下CEF3的关闭流程《转》

    原文地址:https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_Close.md ============================ ...

  9. HSCR | Hirschsprung‘s disease | 巨结肠 | 研究进展

    这个网站介绍得很详细:Hirschsprung Disease,基本的定义.病因.诊断. Hirschsprung disease — integrating basic science and cl ...

  10. 阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装

    阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装1. 背景在我们购买阿里云ECS服务器之后,默认的系统环境是很干净的,我购买的是ubuntu16.04,远程登录进入之后 ...