這幾天教母校初中的OIer,把課件當博客寫,致使博客首頁又變回以前打ACM的樣子了,身心俱疲
趁晚修比較閒,在windows上搭建了學習OpenGL的環境
本文是我的學習記錄,學習建議看教程 https://learnopengl-cn.github.io/
很是感謝原做者JoeyDeVries和兩位翻譯的gjy_1992, Krasjet提供的優質教程html
順帶推薦此次夏促發現的超好用的截圖軟件ShareX,steam上免費,你想獲得的功能ShareX基本都有c++
GLFW是一個專門針對OpenGL的C語言庫,它提供了一些渲染物體所需的最低限度的接口,容許用戶建立OpenGL上下文,定義窗口參數以及處理用戶輸入git
官網獲取Source package,咱們只須要裏面的include文件夾和咱們本身編譯生成的庫github
爲何要在本身機器上編譯?由於從源代碼編譯庫能夠保證生成的庫是兼容你的操做系統和CPU的,而預編譯的二進制文件可能會出現兼容問題(甚至有時候沒提供支持你係統的文件)windows
可是提供源代碼所產生的一個問題在於不是每一個人都用相同的IDE開發程序,於是源碼提供的工程/解決方案文件可能和一些IDE不兼容。人們只能從.c/.cpp和.h/.hpp文件來本身創建工程/解決方案,這是一項枯燥的工做。但所以也誕生了一個叫作CMake的工具函數
CMake是一個工程文件生成工具 http://www.cmake.org/cmake/resources/software.html工具
咱們可使用預約義好的CMake腳本,根據本身的選擇(像是Visual Studio, Code::Blocks, Eclipse)生成不一樣IDE的工程文件。這個工具就能讓咱們從GLFW源碼裏建立一個Visual Studio 2017工程文件,以後就能順利編譯學習
CMake須要一個源代碼目錄和一個存放編譯結果的目標文件目錄,源代碼目錄咱們選擇下載的GLFW的源代碼的根目錄,而後咱們新建一個 build 文件夾做爲目標目錄ui
在設置完目錄以後,點擊Configure(設置)按鈕,讓CMake讀取設置和源代碼。咱們接下來須要選擇工程的生成器,這裏我選擇 Visual Studio 2017 (根據本身的IDE版本設定)CMake會顯示可選的編譯選項用來配置最終生成的庫操作系統
這裏咱們使用默認設置,並再次點擊Configure(設置)按鈕保存設置。保存以後,點擊Generate(生成)按鈕,生成的工程文件會在你的build文件夾中
在build文件夾裏能夠找到GLFW.sln文件,用Visual Studio 2017打開,由於CMake已經配置好了項目,因此咱們直接點擊Build Solution(生成解決方案)按鈕,而後編譯的庫glfw3.lib(注意咱們用的是第3版)就會出如今src/Debug文件夾內
庫生成完畢以後,咱們須要讓IDE知道庫和頭文件的位置,教程提到有兩種方法:
這裏我選擇第二個方式,創建一個文件夾放好了頭文件和lib文件,就能夠開始第一個工程了
首先,打開Visual Studio,建立一個新的項目,若是VS提供了多個選項,選擇Visual C++,而後選擇Empty Project(空項目)
爲了使咱們的程序使用GLFW,咱們須要把GLFW庫連接(Link)進工程。這能夠經過在連接器的設置裏指定咱們要使用glfw3.lib來完成,可是因爲咱們將第三方庫放在另外的目錄Libraries中,咱們的工程還不知道在哪尋找這個文件,因而咱們首先須要將咱們放第三方庫的目錄添加進設置
要添加這些目錄(須要VS搜索庫和include文件的地方),咱們首先進入Project Properties(工程屬性,在解決方案窗口裏右鍵項目),而後選擇VC++ Directories(VC++ 目錄)選項卡(以下圖)
咱們須要把存放頭文件的Include文件夾添加到包含目錄,把存放庫glfw3.lib的Lib文件夾添加到庫目錄
這裏能夠添加任意多個目錄,IDE會從這些目錄裏尋找頭文件。因此只要你將GLFW的Include文件夾加進路徑中,你就可使用<GLFW/..>
來引用頭文件。庫文件夾也是同樣的
最後獲得
如今VS能夠找到所需的全部文件了,最後須要在Linker(連接器)選項卡里的Input(輸入)選項卡里添加glfw3.lib和opengl32.lib(我是Windows平臺,opengl32.lib已經包含在Microsoft SDK裏了,它在Visual Studio安裝的時候就默認安裝了,咱們只需將opengl32.lib直接添加進鏈接器設置裏就好了)
要連接一個庫咱們必須告訴連接器它的文件名。庫名字是glfw3.lib,咱們把它加到Additional Dependencies(附加依賴項)字段中(直接輸入就glfw3.lib能夠),這樣GLFW在編譯的時候就會被連接進來了
咱們還有一件事要作,由於OpenGL只是一個標準/規範,具體的實現是由驅動開發商針對特定顯卡實現的,因爲OpenGL驅動版本衆多,它大多數函數的位置都沒法在編譯時肯定下來,須要在運行時查詢,因此任務就落在了開發者身上,開發者須要在運行時獲取函數地址並將其保存在一個函數指針中供之後使用。幸運的是,有些庫能簡化此過程,其中GLAD是目前最新,也是最流行的庫
GLAD是一個開源的庫,它能解決咱們上面提到的那個繁瑣的問題,GLAD使用了一個在線服務,在這裏咱們可以告訴GLAD須要定義的OpenGL版本,而且根據這個版本加載全部相關的OpenGL函數
打開GLAD的在線服務,將語言(Language)設置爲C/C++,在API選項中,選擇3.3以上的OpenGL(gl)版本(教程中使用3.3版本),以後將模式(Profile)設置爲Core,而且保證生成加載器(Generate a loader)的選項是選中的。如今能夠先(暫時)忽略拓展(Extensions)中的內容,都選擇完以後,點擊生成(Generate)按鈕來生成庫文件
GLAD如今應該提供給你了一個zip壓縮文件,包含兩個頭文件目錄,和一個glad.c文件。將兩個頭文件目錄(glad和KHR)複製到你的Include文件夾中(或者增長一個額外的項目指向這些目錄),並添加glad.c文件到你的工程裏
通過前面的這些步驟以後,你就應該能夠將如下的指令加到你的文件頂部了:
#include <glad/glad.h>
點擊編譯按鈕應該會出現:
這只是由於咱們沒有main函數入口,創建一個test.cpp文件加入
int main() { retuen 0; }
沒有報錯,那麼咱們的工做完成了
因爲我要根據狀況使用兩臺設備開發,若是我使用git或者其餘雲服務在另外一臺PC打開這個項目,以前添加的第三方庫文件和頭文件就會丟失,使用相對路徑就能暫時解決這個問題
先把以前創建的Libraries拉到根目錄
而後更改咱們以前設置的路徑,因爲Libraries已在根目錄下,路徑就能夠這樣寫:
兩個路徑更改完後就是:
確認以後,項目一切正常,wow~!awesome~!