天天看點

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

目錄

​​一.OpenGL的環境:​​

​​1.OpenGL​​

​​2.gult:OpenGL工具庫 OpenGL Utility Toolkit​​

​​3.glew​​

​​4.glfw​​

​​5.glad(2018.9)​​

​​二.舊版本 glut的安裝方法 (資料最多的OpenGL,跳過此步驟即可,這裡隻是為了記錄)​​

​​1.方法​​

​​2.使用VS的插件​​

​​三.新版本 glfw和glad的安裝​​

​​1.下載下傳glfw(管理視窗)和glad​​

​​2.打開vs,建立新的空白工程​​

​​3.添加cpp​​

​​4.OpenGL屬性​​

​​5.glad檔案​​

​​6.運作測試代碼​​

​​7.警告解決辦法​​

在​​初學一​​講了寫基本概念,之後紅寶書直接放上了代碼,是以我這裡先配置一下OpenGL的環境。

首先介紹下OpenGL環境的演變:

一.OpenGL的環境:

1.OpenGL

OpenGL函數庫相關的API有核心庫(gl),實用庫(glu),輔助庫(aux)、實用工具庫(glut),視窗庫(glx、agl、wgl)和擴充函數庫等。gl是核心,glu是對gl的部分封裝。glx、agl、wgl 是針對不同視窗系統的函數。glut是為跨平台的OpenGL程式的工具包,比aux功能強大(aux很大程度上已經被glut庫取代。)。擴充函數庫是硬體廠商為實作硬體更新利用OpenGL的擴充機制開發的函數。

2.gult:OpenGL工具庫 OpenGL Utility Toolkit

glut是實用工具庫,基本上是用于做視窗界面的,并且是跨平台。這部分函數以glut開頭,主要包括視窗操作函數,視窗初始化、視窗大小、視窗位置等函數;回調函數:響應重新整理消息、鍵盤消息、滑鼠消息、定時器函數等;建立複雜的三維物體;菜單函數;程式運作函數。gult對應的開源實作是freegult。

GLUT庫下載下傳位址:​​http://www.transmissionzero.co.uk/software/freeglut-devel/​​

3.glew

glut 或者 freegult 主要是1.0的基本函數功能;glew是使用OpenGL2.0之後的一個工具函數。

不同的顯示卡公司,也會釋出一些隻有自家顯示卡才支 持的擴充函數,你要想用這函數,不得不去尋找最新的glew.h,有了glew擴充庫,你就再也不用為找不到函數的接口而煩惱,因為glew能自動識别你的平台所支援的全部OpenGL進階擴充函數。也就是說,隻要包含一個glew.h頭檔案,你就能使用gl,glu,glext,wgl,glx的全部函數。(這裡需要注意,glew并不包括glut)

GLEW庫下載下傳位址:​​http://glew.sourceforge.net/​​

4.glfw

glfw 無愧于其号稱的 lightweight 的OpenGL架構,的确是除了跨平台必要做的事情都沒有做,是以一個頭檔案,很少量的API,就完成了任務。glfw 的開發目的是用于替代 glut 的,從代碼和功能上來看,我想它已經完全的完成了任務。

一個輕量級的,開源的,跨平台的library。支援OpenGL及OpenGL ES,用來管理視窗,讀取輸入,處理事件等。因為OpenGL沒有視窗管理的功能,是以很多熱心的人寫了工具來支援這些功能,比如早期的glut,現在的freeglut等。

那麼 glfw 有何優勢呢?glut太老了,最後一個版本還是90年代的。freeglut完全相容glut,算是glut的代替品,功能齊全,但是bug太多。穩定性也不好(不是我說的啊),glfw應運而生。

5.glad(2018.9)

glad與glew相比,簡單說glad是glew的更新版。用哪個都行。就是glew比較老,glad比較新。

是以綜上所述,我們需要安裝的就是 glad+glfw

我使用的是VS2017,以下主要講解組裝的辦法。

首先:

二.舊版本 glut的安裝方法 (資料最多的OpenGL,跳過此步驟即可,這裡隻是為了記錄)

1.方法

下載下傳OpenGL的所需要的檔案

​​http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip​​

然後得到5個檔案:

glut.dll glut32.dll glut.lib glut32.lib glut.h

然後:

1.找到目錄..\VC\Tools\MSVC\14.10.25017\include\gl(沒有的話就建立一個)。 将glut.h放到裡面。

2.找到目錄..\VC\Tools\MSVC\14.10.25017\lib\x86  将glut.lib,glut32.lib放到裡面。

3.最後把glut.dll和glut32.dll放到C:\Windows\system32檔案夾内(電腦32位系統)或‪C:\Windows\SysWOW64(電腦64位系統)。

2.使用VS的插件

打開vs建立一個C++項目(Win32控制台-空白項目)

然後點選 項目—管理Nuget程式包(若沒有找到項目底下的這個選項,請​​點選這裡​​)

然後點選浏覽—在搜尋欄輸入 NupenGL

然後安裝(如果有兩個就安裝兩個)。

裝完後測試一下,輸入以下代碼

  1. ​#include <GL/glut.h>​

  2. ​void Show()​

  3. ​{​

  4. ​glClear(GL_COLOR_BUFFER_BIT);​

  5. ​glRectf(-0.1f, -0.1f, 0.5f, 0.5f);​

  6. ​glFlush();​

  7. ​}​

  8. ​int main(int argc, char *argv[])​

  9. ​{​

  10. ​glutInit(&argc, argv);​

  11. ​glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);​

  12. ​glutInitWindowPosition(100, 100);​

  13. ​glutInitWindowSize(400, 400);​

  14. ​glutCreateWindow("OpenGL");​

  15. ​glutDisplayFunc(Show);​

  16. ​glutMainLoop();​

  17. ​return 0;​

  18. ​}​

運作後就會看到一個白色的正方形

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

三.新版本 glfw和glad的安裝

1.下載下傳glfw(管理視窗)和glad

首先是glfw

​​http://www.glfw.org/download.html​​

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

在這裡我們選擇編譯好的版本 想自己編譯的朋友可以下載下傳 Source package(用CMake)

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

我們選擇32-bit,這裡不是按照電腦來選的,是按照vs裡面的

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

x86就是32位的

其次是glad

glad有一個​​線上服務​​,直接下下來就可以用了(編譯好的),将語言(Language)設定為C/C++,在API選項中,選擇3.3以上的OpenGL版本(3.3是可程式設計管線版本,但更新的版本也能正常工作)。之後将模式(Profile)設定為Core,并且保證生成加載器(Generate a loader)的選項是選中的。現在可以先(暫時)忽略拓展(Extensions)中的内容。都選擇完之後,點選生成(Generate)按鈕來生成庫檔案。

下載下傳是個壓縮檔案。

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

壓縮檔案裡包含兩個頭檔案目錄(内有頭檔案glad.h和khrplatform.h),和一個src檔案夾下的glad.c檔案。

然後我們把這下載下傳好的兩個檔案夾移到某個檔案下。

2.打開vs,建立新的空白工程

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

注:如果建立Windows控制台應用程式,程式内部會自動包含stdafx.h的頭檔案,你必須在源檔案的開頭寫上“#include“stdafx.h”相關語句,而且之後引入glew,glfw包會有莫名其妙的錯誤。是以建立一個空項目。

3.添加cpp

點選“解決方案資料總管”,右鍵點選源檔案,添加新項,建立.cpp源檔案,輸入代碼,正常的代碼即可。(我這裡加了一個graphics.cpp)

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

4.OpenGL屬性

右鍵點選項目,在彈出的選項中,單擊 “屬性”。

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

點選“VC++目錄”,第二步會有下拉清單,單擊“編輯”

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

點選添加頭檔案。分别添加下載下傳的glad和glfw檔案夾下的include檔案夾(include檔案夾下是我們需要的頭檔案),點選“确定”

OpenGL 關于舊版glut和新版本glfw和glad的環境配置
OpenGL 關于舊版glut和新版本glfw和glad的環境配置

同樣的道理,加入庫檔案。(庫檔案和頭檔案是相輔相成的),對應的路徑就是glfw檔案夾下的lib檔案夾(glad不需要)

注:當添加glfw時,低版本請選擇對應版本,2015以上版本請選擇“lib-vc2015”

之後包含的庫檔案VS還認不出來,我們需要指定一下。配置連結器。

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

點選“編輯”後輸入如下:

  1. ​opengl32.lib​

  2. ​glfw3.lib​

注:行與行之間請按回車,opengl32.lib是系統自帶的。

點選确定

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

5.glad檔案

将glad.c檔案複制到源檔案夾下,直接複制,然後右擊源檔案夾粘貼即可。

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

至此OpenGL的環境就初步配好了

6.運作測試代碼

在之前的cpp中添加如下代碼:(初始化一個Opengl視窗)

  1. ​#include <glad/glad.h>​

  2. ​#include <GLFW/glfw3.h>​

  3. ​#include <iostream>​

  4. ​const unsigned int SCR_WIDTH = 800;​

  5. ​const unsigned int SCR_HEIGHT = 600;​

  6. ​int main()​

  7. ​{​

  8. ​glfwInit();​

  9. ​glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);​

  10. ​glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);​

  11. ​glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);​

  12. ​GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);​

  13. ​if (window == NULL)​

  14. ​{​

  15. ​std::cout << "Failed to create GLFW window" << std::endl;​

  16. ​glfwTerminate();​

  17. ​return -1;​

  18. ​}​

  19. ​glfwMakeContextCurrent(window);​

  20. ​if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))​

  21. ​{​

  22. ​std::cout << "Failed to initialize GLAD" << std::endl;​

  23. ​return -1;​

  24. ​} ​

  25. ​while (!glfwWindowShouldClose(window))​

  26. ​{​

  27. ​glClearColor(0.2f, 0.3f, 0.3f, 1.0f);​

  28. ​glClear(GL_COLOR_BUFFER_BIT);​

  29. ​glfwSwapBuffers(window);​

  30. ​glfwPollEvents();​

  31. ​}​

  32. ​glfwTerminate();​

  33. ​return 0;​

  34. ​}​

點選“運作”,成功初始化了一個OpenGL的視窗

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

但是,當我們關掉程式回到“錯誤清單”中會發現警告LNK4098預設庫“MSVCRT”與其他庫的使用沖突;

請使用 /NODEFAULTLIB:libraryOpenC:\Users\g1018\source\repos\Open\Open\LINK1

OpenGL 關于舊版glut和新版本glfw和glad的環境配置

解決方法如下。

7.警告解決辦法

把之前的連結器的那個頁面調出來。

OpenGL 關于舊版glut和新版本glfw和glad的環境配置
OpenGL 關于舊版glut和新版本glfw和glad的環境配置

點選“編輯”,輸入如下:

MSVCRT.lib      
OpenGL 關于舊版glut和新版本glfw和glad的環境配置

點選“确定”。注:如果往後還有庫沖突,解決方法同理。