c++和opengl实现gis_从零开始的图形学学习(零):一切的开始 —— 自建OpenGL开发框架
本章內容:自建輕量級靜態OpenGL開發框架,認識第三方庫的編譯與鏈接方法。
Part I. Introduction
圖形學學習初期,在使用C++開發OpenGL項目時,不可避免的需要接觸各種第三方依賴包的加載和對其進行開發平臺/環境適配等問題。對于大部分C++基礎不是特別牢固,或者對于開發平臺IDE的工作原理不是特別熟悉的同學來說,這個過程不是特別友好。很容易把大把的時間和精力耗費在對第三方庫文件的編譯、鏈接等相關問題的解決上。
針對這種現象,目前有譬如Glitter等項目框架集成了OpenGL各種常用的第三方依賴庫,方便了圖形學新手的學習。但是這一類集成框架具有以下三個小缺點:
- 框架體積過于龐大,每開啟一個新項目就必須重新復制原有框架(文件體積大于1G),導致不必要的資源冗余。
- 在集成框架下,如果涉及到其他框架不具備的第三方依賴庫,新手很難自行添加導致進度受阻難以進行。
- 無法比較簡單地更改項目名稱對于一些具有強迫癥的開發人員很不友好。
本文主要致力于提供一種通過鏈接靜態依賴庫,自行搭建OpenGL開發框架的方法,以便于圖形學新手思路清晰地學會自行加載第三方庫,以及對框架架構有一個整體的認識。框架具有體積小(約20MB),可調整性強,各種修改比較自由等優點。
推薦使用本框架配合LearnOpenGL內容學習。Part II. Preparation
1. 建立框架文件結構。
對于常用的圖形學項目而言,文件結構一般如下。
- ExampleProject(框架根文件夾,可以取任何名字。在此文件夾內創建Xcode新項目)
- ExampleProject(此文件夾為Xcode項目目錄,新建Asserts、Headers、Shaders、Sources文件夾)
- Asserts(放置所有紋理、模型等資源)
- Headers(放置所有用戶定義頭文件)
- Shaders(放置所有渲染Shader文件)
- Sources(放置main.cpp與glad.c這一類源程序文件)
- include(所有第三方庫的頭文件放置處(.h文件))
- lib(所有第三方庫的lib文件放置處(.a文件))
- ExampleProject(此文件夾為Xcode項目目錄,新建Asserts、Headers、Shaders、Sources文件夾)
按照圖一建立文件結構,進入下一步。
圖一:示例框架結構2. 下載 Library GLFW
下載取得一個glfw-3-2.3.zip文件,mac下自動解壓。I. GLFW是什么?
- GLFW為Graphics Library Framework的縮寫。
II. GLFW的主要負責什么功能?
- 創建、管理窗口
- OpenGL Context
- 處理手柄、鍵盤、鼠標輸入
III. 為什么要用GLFW?
- 因為OpenGL并沒有提供窗口渲染的方法,必須依賴第三方庫創建、管理窗口。
3. 下載適合您的 Library glad
將語言(Language)設置為C/C++,在API選項中,選擇3.3以上的OpenGL(gl)版本,將模式(Profile)設置為Core,并且保證生成加載器(Generate a loader)的選項是選中的。現在可以先(暫時)忽略拓展(Extensions)中的內容。都選擇完之后,點擊生成(Generate)按鈕來生成庫文件。下載取得一個glad.zip文件,mac下自動解壓。I. glad是什么?
- glad為OpenGL Loading Library的縮寫。
II. glad的主要負責什么功能?
- 由于OpenGL只是一個標準/規范,具體的實現是由驅動開發商針對特定顯卡實現的。而OpenGL驅動版本眾多,它大多數函數的位置都無法在編譯時確定下來,需要在運行時查詢。所以任務就落在了開發者身上,開發者需要在運行時獲取函數地址并將其保存在一個函數指針中供以后使用。取得地址的方法因平臺而異,在Windows上會是類似這樣:
- 你可以看到代碼非常復雜,而且很繁瑣,我們需要對每個可能使用的函數都要重復這個過程。幸運的是,有些庫能簡化此過程,其中GLAD是目前最新,也是最流行的庫。
III. 為什么要用glad?
- 一定程度上,glad能夠用于在開發中取代glew(OpenGL Extension Wrangler Library)。glad是一個比較新的Lib,比較推薦XD。
4. 下載 Library glm
下載取得一個glm-0.9.9.6.zip文件,mac下自動解壓。I. glm是什么?
- glm是OpenGL Mathematics的縮寫,它是一個只有頭文件的庫。
II. glm的主要負責什么功能?
- glm是一個數學函數庫,包含圖形領域數學常用的向量、矩陣等函數。
III. 為什么要用glm?
- OpenGL沒有自帶任何的矩陣和向量函數,所以我們必須定義自己的數學類和函數。glm抽象了所有的數學細節,為我們使用數學函數提供了方便。
5. 下載 Library stb
下載整個倉庫獲得stb-master.zip,解壓壓縮包將文件夾重命名為stb。I. stb是什么?
- stb是作者名字Sean T. Barrett的首字母縮寫(initials),它是一個非常流行的(單)頭文件圖像(加載)庫。
II. stb的主要負責什么功能?
- 負責加載大部分流行的文件格式的圖片作為紋理文件(暫時,它還具有很多其他功能)。
Part III. Libraries Make, Build and Link
對于我們下載的第三方Libraries,大致可以分為以下三種類型。以下過程均以MacOS下的Xcode平臺為例,Windows/Linux環境下整體思路不變。
一、需要自行編譯、鏈接的第三方庫:以GLFW為例。
這一類庫最顯著的特征就是它的目錄下面有CMakeLists.txt以及各種cmake文件。這一類庫則需要自行編譯、鏈接。對于這一類庫,大致需要三個階段處理。
1. Make Phase
>> cd glfw-3.3 // 進入GLFW文件夾 >> mkdir Build // 新建Build文件夾 >> cd Build //進入Build文件夾 >> cmake -G "Xcode" .. // make 解釋: 在GLFW目錄下創建一個Build目錄(只是為了使文件結構清晰),cmake外層源文件。 同理將"Xcode"替換成諸如"Visual Studio 14 Win64"等可以獲得相應平臺的make生成文件。此階段獲得目標開發平臺的工程文件——GLFW.xcodeproj。
2. Build Phase
打開文件GLFW.xcodeproj,直接Build All。完成編譯。
此階段獲得目標開發平臺的靜態依賴庫文件——libglfw3.a,位于Debug文件夾下。此時文件目錄結構如下圖所示。
圖二:glfw文件目錄結構3. Link Phase
添加頭文件和靜態庫到框架內
- 將頭文件文件夾(一般位于Library的include目錄下,也可能是別的名稱,內部是.h的頭文件)移動到include文件夾下。
- 將依賴庫文件(MacOS系統下為.a文件)移動到lib文件夾下
目錄結構如下圖所示。
圖三:示例框架結構配置 Xcode 尋找路徑和鏈接靜態庫
打開項目工程文件ExampleProject.xcodeproj,配置IDE的頭文件搜索目錄、庫文件搜索目錄、編譯源以及鏈接。
- 過程[1]:配置 Search Path:
- Header Search Path: $(SRCROOT)/include
- Library Search Path: $(SRCROOT)/lib
- User Header Search Path: $(SRCROOT)/ExampleProject/Headers
Header Search Path:Xcode搜索使用#include <>的頭文件時查找的目錄。
Library Search Path:Xcode使用外部依賴包時搜索的路徑。
User Header Search Path:Xcode搜索使用#include ""的頭文件時查找的目錄。圖四:Build Settings配置
- 過程[2]:配置 Compile Sources:
- add glad.c
- add main.cpp
- 過程[3]:配置 Link Binary With Libraries
- add libglfw3.a
- add IOKit.framework
- add CoreVideo.framework
- add OpenGL.framework
- add Cocoa.framework
glm、assimp、bullet等常用庫均用此方法加入框架。
二、不需要需要自行編譯的第三方庫:以glad為例。
這一類庫的特征則為它們的目錄由include文件夾(內含.h頭文件)和src(或者別的名稱)文件夾(內含.c源文件)構成。
引入框架的方法:
- 將include文件夾下面所有文件/文件夾加入我們的框架的include文件夾下面(請注意此時你的操作與后面頭文件的應用關系#include <glad/glad.h>意味著你把glad頭文件文件夾拖進了include里面)。
- 把src文件夾下面的源文件加入Sources文件夾內,并執行過程[2]。
三、單頭文件庫:以stb為例。
這一類庫無需編譯鏈接等工作。
引入框架的方法:
- 將stb整個文件夾我們的框架的include文件夾下。
我們需要在頭文件加入一行預處理(preprocessor),預處理器會修改頭文件,讓其只包含相關的函數定義源碼,等于是將這個頭文件變為一個 .cpp 文件了。現在只需要在你的程序中包含stb_image.h并編譯就可以了。
#define STB_IMAGE_IMPLEMENTATION #include <stb/stb_image.h>需要注意的是:
- 絕對不要在頭文件(header (.h) files)中加入這句話#define STB_IMAGE_IMPLEMENTATION 只有 C/C++ file 才可以加入這句 implementation。
- 這句話必須保證唯一性(UNIQUE),只能添加一次!
Part IV. Have Fun With Graphics
在你成功完成本文提到的四個依賴庫的加載后,你的項目文件結構大概會是這個樣子的:
此時如果把這些文件加入你的Asserts、Headers、Shaders和Sources文件夾并且同步到Xcode運行的話,那么你就能得到一個2Dgame-Breakout游戲!這是不是比一個黑框框要好玩的多?
按空格鍵開始,A/D鍵左右移動。- 注意:Xcode默認相對目錄不是工程文件所在目錄而是可執行文件所在目錄。所以請在Product->Scheme->Edit Scheme->Run->Options->Working Directory中勾選并設置當前目錄為相對根目錄以便文件定位!
Have Fun With Graphics! XD
總結
以上是生活随笔為你收集整理的c++和opengl实现gis_从零开始的图形学学习(零):一切的开始 —— 自建OpenGL开发框架的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么打开python shell_Pyt
- 下一篇: python数据分析工资_python3