[筆記]Windows下為mingw安裝OpenGL環境(GLUT)

來源:互聯網
上載者:User

標籤:

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.dllD:\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 -lglut32CFLAGS=-g -DDEBUG -DGLUT_DISABLE_ATEXIT_HACKall:    g++ main.cpp -c -o main.o $(CFLAGS)     g++ main.o $(LDFLAGS) -o main.execlean:    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();}
運行結果

[筆記]Windows下為mingw安裝OpenGL環境(GLUT)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.