[笔记]Windows下为mingw安装OpenGL环境(GLUT)

时间:2015-03-03 13:21:28   收藏:0   阅读:6101

OpenGL只是一个标准,它的实现一般自带在操作系统里,只要确保显卡驱动足够新就可以使用。如果需要在程序里直接使用OpenGL,会有很多非常恶心的预备工作要做。要跳过这些工作,可以用一个utility库,新一点的有GLEW,因为开源所以安装相对方便(大不了丢进去一起编译),但各种教程和书里常见的是闭源的GLUT(很老的库囧),安装相对麻烦,特别是在windows下,折腾了小半天才搞定,所以在这里记录一下。

1. 下载 GLUT

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

2. 放置头文件和库文件

解压下载到的zip,里面就是相关的头文件和库文件了。因为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,放完之后大概是这样:

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

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

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

3. 配置参数

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

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

4. 代码里使用头文件

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

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

顺序不能反。一般教程或者样例代码里如果不是针对win32平台不会有#include <windows.h>,很多东西的定义就找不到了,所以跑之前要检查。

例子

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

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

程序main.cpp,来自OpenGL Code Samples,加上了 windows.h:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#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();
}

运行结果

技术分享

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!