# 電腦圖學環境設定
[toc]
## 前言
這個文件幾乎上包含了所有安裝電腦圖學所需環境的教學以及問題解決方案,但裡面還是有幾點以下想聲明:
1. 文件請多多閱讀,真的遇到問題也請先上網查詢(推薦:stackoverflow),真的不懂再來詢問同學、助教或是老師,Lab 503 也非常歡迎大家一起來討論問題。
2. 嚴禁伸手黨、或是只想要懶人包,此心態不可取!
3. 請清楚了解自己對於電腦的操作(尤其是指令的含意),看到指令強烈建議不要只全部複製貼上,這其實也是幫助同學建立良好習慣,避免有人將不可信來源的網站上一串指令輸入到電腦裡面,結果被偷偷安裝了挖礦程式還都不知情。
> 對於可能沒用過終端機或是不熟的同學,複製命令指令時請不要把 `$` 也複製上去,這只是一個標註它是命令列指令而非程式碼而已,不然要是複製上去的話,所有的指令都會是無效的哦!
------------------------------------------------------------
## Windows
### 前置需求
* 作業系統需要 Window 7 或者更新的版本(此教學為 Windows 10)
* 需要安裝 [Git](https://git-scm.com/)
* 需要安裝 [Visual Studio](https://visualstudio.microsoft.com/zh-hant/downloads/) 2015 Update 3 或更新的版本(此教學使用 Visual Studio 2019)
### 注意事項
1. 安裝 Visual Studio 時,要有安裝到 MSVC(編譯器)、Windows SDK(開發工具) 以及安裝 Visual Studio 的**英文語言包**才行,且最好安裝在 C 磁碟槽。
2. 小心防毒程式會誤判 `vcpkg.exe` 為病毒(Avast 有時候會誤判,發生誤判請加到白名單即可)。
3. 為了方便操作,可以加入 vcpkg 設定到環境變數 PATH 中。

### 安裝 vcpkg
1. 首先在 `C:\` 路徑下新增一個資料夾,名稱可以叫 `dev` 或者 `src`,可以自己依造喜好來決定,但往後的 vcpkg 路徑就要記住,這邊教學將會使用 `dev` 為資料夾名稱。
2. 創建好了,請開啟終端機(命令提示字元或 Powershell),並輸入指令:
```bash
# 切換目錄到 C:\dev
$ cd C:\dev
```
3. 接著使用 Git 來把 [vcpkg](https://github.com/microsoft/vcpkg) 在 Github 上的 repo 複製下來到本地端,指令為:
```bash
# 把 vcpkg 在 github 上的 repo 複製下來,所以 C:\dev 中將會多一個叫 vcpkg 的資料夾
$ git clone https://github.com/microsoft/vcpkg
```
4. 接著執行裡面的啟動腳本程式,這個程式將會開始建置 vcpkg 最後產生 `vcpkg.exe`,指令為:
```bash
$ .\vcpkg\bootstrap-vcpkg.bat
```
5. 安裝完成,這下在路徑 `C:\dev\vcpkg` 中就會有一個 `vcpkg.exe`,並且透過在終端機輸入指令即可看到可使用的指令列表:
```bash
# 沒有加入環境變數 PATH 之前,需要特別使用 絕對路徑 或者是 相對路徑,才能呼叫到 vcpkg
$ .\vcpkg\vcpkg
# 有加入環境變數,使用上就會很方便,也不需要指令路徑在任何的工作目錄下都可以執行
$ vcpkg
```
> 如果你嘗試輸入 `vcpkg` 卻跳出說找不到該指令,那就是環境變數沒設定好,環境變數的設定請[看這](#環境變數設定)
安裝好 vcpkg 之後,就可以使用基本指令安裝所需要的套件,詳細使用方法請詳閱 [vcpkg 使用方法](#如何使用-vcpkg)。
### 安裝 CMake
到 CMake [官網](https://cmake.org/download/)下載安裝檔案(.msi)並安裝即可,最新穩定辦本為 3.22,記得安裝的時候要勾選【Add CMake to the system PATH for all users】,這樣一來就會自動把 cmake 加入環境變數了。

安裝好後,在終端機輸入 `cmake` 就會顯示相關資訊,就代表安裝成功了:

### 安裝 Ninja
這個安裝其實是非必要的,前提是如果你習慣使用 VS Code 做為 IDE 的話,我才會建議安裝 Ninja,它是一個輕量級的建置系統,安裝方法很簡單,直接到[官方 Github 頁面](https://github.com/ninja-build/ninja/releases)下載壓縮檔(`ninja-win.zip`),並解壓縮它,將裡面已經建置好的執行檔 `ninja.exe`,移置到路徑 `C:\dev\Ninja\` 當中(自己要創建資料夾),並且一樣將 ninja 設定到環境變數 PATH 中,如此一來開啟終端機之後就可以輸入指令:

> 有看到以上資訊就代表安裝成功;環境變數設定請[看這](#環境變數設定)。
### 編譯器 就是不爽用 MSVC
一般來說,絕大數人如果使用的是 Windows 系統,而且有安裝 Visual Studio 的話,就算 IDE 不是用它,但編譯器都是預設抓取 MSVC,這個是微軟開發的 C 或 C++ 編譯器,如果你有個人喜好就是想用 GCC 的話,這邊有提供一個方法可以教大家使用。
#### 安裝 TDM-64-GCC
通常 GCC 編譯器本身是 Linux 或是 Unix 系統上才會出現的編譯器,而移植到 Windows 上的版本其實有很多種,例如:`MinGW`、`MSYS2`、`Cygwin` 等等,但這邊我推薦使用 `MinGW`,但是 `MinGW` 其實是有分 `MinGW32` 和 `MinGW64`,顧名思義就是位元的不同,所以這邊我一律推薦請下載 `TDM-64-GCC`,裡面就包好了 32 位元和 64 位元的 `MinGW`,相關的設定也都處理好所以非常方便,載點在[這邊](https://jmeubank.github.io/tdm-gcc/download/)。
> 記得要下載【tdm64-gcc-10.3.0-2.exe】,要有 64 和 32 位元的 GCC;且通常如果電腦還有其他的 GCC ,除非你真的很確保你不會發生衝突,不然我建議都是一律先移除乾淨再來安裝新的 GCC。
1. 下載點開安裝檔後,左邊會列出你電腦上有安裝過的版本(如果是第一次安裝右邊的清單會是空的),路徑各位可以自行決定,但助教我推薦 `C:\dev\TDM-GCC-64` 路徑,也方便進行管理,這邊只需要按下【Create】即可。

2. 請選擇含有 MinGW64 的版本:

3. 選擇你要安裝的路徑。

4. 使用預設的安裝設定即可,下一步直接點擊【Install】即可:

5. 安裝完成之後,理論上只要安裝成功,你就可以從終端機上輸入以下指令:

如此一來這樣就代表有安裝成功,在 PowerShell 上你還可以輸入以下指令來查看該指令對應到的程式路徑:

#### 使用 GCC 編譯可能會發生的問題
1. 第一個使用 GCC 編譯程式的同學,你的 vcpkg 所有的套件的 triplet 必須都是安裝 `x64-mingw-dynamic` 版本的,安裝不同 triplet 版本的教學請[看這](#如何使用-vcpkg)。
2. 你的 `CMakeLists.txt` 當中,必須修改引入 `OpenGL` 函式庫的程式碼為如下:
```cmake=
find_package(OpenGL REQUIRED)
target_link_libraries([你的target名稱] PRIVATE OpenGL::GL)
```
> 一定要有引入 `OpenGL::GL` 才行,助教之前給的範例程式有的寫錯,譬如可能是寫 `OpenGL32`、或是完全沒有引入 `OpenGL::GL` 相關的指令;如果是有使用到 glu 函式庫的話,就必須還要額外引入 `OpenGL::GLU`,但這個通常是你有用到舊版(Legacy)OpenGL 才會需要
> 雖然如果使用 MSVC 編譯似乎是可忽略這些引入設定,但現在為了統一且跨平台以及環境的一致性,就算你是使用 MSVC 編譯的我也強烈建議你也加上這些 OpenGL 的引入設定。
3. 如果你想使用 GCC 編譯的話,我這邊教學只教 Visual Studio Code 的設定,一樣請先參考[IDE設定的 VS Code 部分](#IDE-設定),並且在 `settings.json` 中修改設定檔為如下:
```json=
{
"cmake.buildDirectory": "${workspaceFolder}/build/${buildType}",
"cmake.generator": "Ninja",
"cmake.configureSettings": {
"CMAKE_MAKE_PROGRAM": "C:/dev/Ninja/ninja.exe",
"CMAKE_TOOLCHAIN_FILE": "C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake",
"VCPKG_TARGET_TRIPLET": "x64-mingw-dynamic"
}
}
```
> 注意就算你 vcpkg 安裝了 `x64-mingw-dynamic` 的套件,但你的程式碼可能編譯的時候依舊還是抓取 `x64-windows` 的 triplet,所以這邊要多一個 `VCPKG_TARGET_TRIPLET` 參數的設定。
### Windows 上創建 Symbolic Link 出現問題
這個問題只會發生在 Windows 作業系統上,如果你是使用助教所提供的 GLFW 或是 SDL2 的程式範例檔案,因為這個檔案會使用到外部檔案例於著色器(Shader)以及貼圖(Texture)等等,所以我們有在其專案中的 `CMakeLists.txt` 上設定以下腳本:
```cmake=
add_custom_command(TARGET triangle-example POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink
"${CMAKE_SOURCE_DIR}/shaders"
"$<TARGET_FILE_DIR:triangle-example>/shaders"
DEPENDS
"${CMAKE_SOURCE_DIR}/shaders" # Make sure the directory exists
COMMENT "Creating symlink from build tree to project resources..."
VERBATIM
)
```
> 基本上該 CMake 指令只是創建一個 Symbolic Link 的資料夾在你程式編譯二進位執行檔案的目錄下(`$<TARGET_FILE_DIR:tgt>`,這個是 CMake 的 Generator 表達式,詳情可參考[此文件](https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html)),可以理解成捷徑的一種,但跟 Windows 專有的 `.lnk` 捷徑檔是截然不同的東西,這個比較常使用在 Linux 或是 Unix 系統上,被稱為【軟連結】。
> 至於為甚麼需要在二進位根目錄下創建 Symbolic Link 的原因,主要是因為我剛剛所說的外部檔案,一般來說都是會放置在專案根目錄下(可能跟程式碼同個目錄層),但程式編譯成可執行檔之後的路徑會有所變動,而一般來說我們的引入路徑都是寫所謂的【相對路徑】,為了避免這些文件讀取不到的情況,才會使用【軟連結】這個方式。
而這個指令一般而言會導致編譯程式會發生以下錯誤:

其解決方案很簡單,就是到【設定】->【更新與安全性】->【開發人員專用】,然後將【開發人員模式】給它開啟起來就解決了:

### 環境變數設定
這邊教學只教 Windows 10,其他版本作業系統的設定方式基本上大同小異,但可能某些地方會不太一樣,記得多加注意就好。
1. 請先對【本機】按下右鍵,並點選【內容】。

2. 將會跳出 Windows 新版本的【設定】,拉到最下面點選【進階系統設定】。

3. 點選【環境變數】。

4. 請在【系統變數】區塊,找尋 `PATH` 並點選後,選擇【編輯】。

5. 請點選右上的【新增】,接著就可以輸入想要設定環境變數的路徑:

* 如果是 `vcpkg.exe` 的話,路徑通常是:`C:\dev\vcpkg`
* 如果是 `ninja.exe` 的話,路徑通常是:`C:\dev\Ninja`
6. 按下確定之後就可以關掉,之後終端機一定要重新啟動這個環境變數的設定才會奏效,如此一來就可以設定成功了。
------------------------------------------------------------
## macOS(Darwin)
本教學使用 MacBook Air 2015,且作業系統版本為 macOS Big Sur (11.4) 做為測試環境。
### 前置需求
1. Apple Developer Tools
2. Homebrew
3. gcc(版本需要大於 6)
4. Git (macOS 似乎會自己安裝)
### 安裝 Apple Developer Tools
我自己不太確定是不是兩個步驟都必須要做,至少我自己是先下載了 XCode,安裝好後才開啟終端機(bash 或 zsh)並輸入以下指令:
```bash
$ xcode-select --install
```
> 這大概是確保你的蘋果電腦相關的開發環境,我記得安裝之後就會有 Clang 編譯器。
### 安裝 Homebrew
2. 先確認你的電腦是否有安裝 Homebrew,似乎比較新的 macOS 都已經內建這個套件管理器,但還是確認一下會比較保險:
```bash
$ brew
```
如果發生找不到該指令的問題話,就輸入以下指令來安裝 Homebrew 吧:
```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```
### 透過 Homebrew 安裝 gcc
安裝好 Homebrew 之後就用它來安裝 gcc 吧!
```bash
$ brew install gcc
```
### 安裝 vcpkg
之後就可以來安裝 vcpkg,基本上安裝的方法一樣也是透過 Git 的方式來安裝,而安裝路徑就沒有一定的限制,vcpkg 的 github 頁面還寫說:【it can be installed anywhere.】,所以這邊就是隨著使用者安裝開心吧,但這邊助教建議可以安裝在 `~\repo` 下,路徑名稱不要太長,不然打參數的時候會很辛苦:
```bash
# 下載 vcpkg 並進行建置(請記得事先 cd 到正確的工作目錄下)
$ git clone https://github.com/Microsoft/vcpkg.git
$ ./vcpkg/bootstrap-vcpkg.sh
```
基本上安裝好後,你就可以輸入以下語法來執行 vcpkg:
```bash
# 記得切換到你 vcpkg 上一層的工作目錄下
$ ./vcpkg/vcpkg
# 如果在同一個目錄層下就是
$ ./vcpkg
# 當然我相信 apple 應該也可以設定環境變數,我是不會設定,這部分可能就要自行研究了
$ vcpkg
```
至於如何使用 vcpkg 請參考 [vcpkg 使用方法](#如何使用-vcpkg)。
如果你是想了解我需要安裝甚麼套件的話,請[詳閱這邊](#安裝-vcpkg-套件)。
### 安裝 CMake
如果你有需要安裝的話,就透過 Homebrew 安裝吧!
```
$ brew install cmake
```
### 安裝 ninja
如果你有需要安裝的話,就透過 Homebrew 安裝吧!
```
$ brew install ninja
```
------------------------------------------------------------
## Linux
### 前置需求
1. Git
2. gcc(版本需要大於 6)
### 安裝 vcpkg
通常會使用 Linux 作業系統的人,我想對於這些設定都相當熟悉,我就不多加解釋了:
```bash
# 下載 vcpkg 並進行建置(請記得事先 cd 到正確的工作目錄下)
$ git clone https://github.com/Microsoft/vcpkg.git
$ ./vcpkg/bootstrap-vcpkg.sh
```
基本上安裝好後,你就可以輸入以下語法來執行 vcpkg:
```bash
$ ./vcpkg/vcpkg
```
至於如何使用 vcpkg 請參考 [vcpkg 使用方法](#如何使用-vcpkg)。
如果你是想了解我需要安裝甚麼套件的話,請[詳閱這邊](#安裝-vcpkg-套件)。
------------------------------------------------------------
## IDE 環境設定
> 基本上 IDE 設定都是跨平台的,所以設定上都是大同小異,雖然上面諸多設定都是擷取至 Windows 上的螢幕截圖,但設定流程與步驟都是差不多的。
### Visual Studio 2019
如果使用 Visual Studio 做為 IDE 的話,只需要輸入以下行指令就可以自動幫你處理好 vcpkg 相關的環境設定,指令為:
```bash
# 同時這個指令也會顯示出你的 CMAKE_TOOLCHAIN_FILE 完整路徑
$ vcpkg integrate install
```
如果你都是按照本教學的方式的話,理論上你會是安裝 64 位元的套件,所以你的程式編譯的時候只能使用 x64 的選項,如下圖:

如果你想要編譯 32 位元的程式,那 vcpkg 的套件就必須要安裝 x86-windows 版本,詳情請看[如何使用 vcpkg 的 triplet 的部分](#如何使用-vcpkg)。
> 使用 Visual Studio 開發,繳交作業或是使用 git 版控時請務必將 .vs 隱藏資料夾刪除(刪除後不會影響你的程式,所以不用害怕),這個檔案單純只是 Visual Studio 的一些設定檔,是不必須而且**檔案很肥**。

#### 刪除 CMake 快取
在 Visual Studio 有個刪除 CMake 快取的方法,那就是從 IDE 裡面的方案總管中,對著 `CMakeLists.txt` 按下右鍵,找尋【CMake 快取】選項後,點選【刪除快取】即可。

#### 產生 CMake 快取
當你發現你點開 `CMakeLists.txt` 之後,上面跳出黃黃的一小條資訊,這代表目前你專案根目錄的 CMake 快取可能還沒有產生,或者是你剛剛更動了 `CMakeLists.txt` 文件中的設定導致快取還沒有更新,這個時候不要猶豫按下【產生】就對了。

### Visual Studio Code
由於 Visual Studio Code 本身是一款輕量級的 IDE,所以如果你想要用 VS Code 的話,你首先會需要安裝 `CMake Tools` 套件:

> 有點忘記安裝此套件是否有強制需求一定要先安裝 CMake 了,理論上就先安裝看看,如果真的有發生甚麼錯誤的話,再自行到 CMake 官網下載並安裝之後再來安裝 VS Code 的套件吧,至於 CMake 的安裝教學請[看這](#安裝-CMake)。
再來安裝另一個套件叫 `C/C++` 基本上就是增加對於 C 或是 C++ 的語法偵測等等擴充功能:

這些套件都安裝好後,只要你使用 VS Code 開啟 CMake 專案(一定要有 `CMakeLists.txt` 檔案才行),都會跳出相關的 CMake 設定,譬如說下方這一列:

1. 選擇你的編譯工具組,譬如這邊預設就是選擇 `Visual Studio Community 2019 Release - amd64` 也就是採用 MSVC 做為預設的編譯器,如果你想改用 GCC 的話也是改動這一個設定,但詳情請[看這](#編譯器-就是不爽用-MSVC)。
2. 這是建置 CMakeLists.txt 裡面所定義的目標(Target),當如果你一個 CMakeLists.txt 裡面定義多個目標時,可以透過 3. 這邊的選項來設定,目前預設是 `[all]` ,也就是全部都建置。
3. 可以選擇哪一個目標來建置。
4. 這個蟲蟲圖案代表執行時搭配 debugger,可以用來除錯用但是執行效能差。
5. 這個代表是直接執行編譯好的程式。
6. 你可以選擇你要執行哪一個 CMakeLists.txt 中所定義的目標來執行。
7. 你可以選你要 CMake 建置 Debug 模式還是 Release 模式。
但是即便如此,目前可能還是會發生無法編譯的情況,原因是因為我們並沒有告訴 CMake 我們的 vcpkg 路徑在哪裡,這樣它會抓不到我們的套件,如此一來就不能編譯,所以我們需要自行在專案根目錄下創建一個名稱為 `.vscode` 的資料夾,並在裡面新增 `settings.json` 檔案,內容如下:
```json=
{
"cmake.buildDirectory": "${workspaceFolder}/build/${buildType}",
"cmake.generator": "Ninja",
"cmake.configureSettings": {
"CMAKE_MAKE_PROGRAM": "C:/dev/Ninja/ninja.exe",
"CMAKE_TOOLCHAIN_FILE": "C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake"
}
}
```
這邊的設定是說,`cmake.buildDirectory` 可以自訂義你建置 CMake 專案的生成位置,會這樣設定的好處就是說至少會去區分 `debug` 和 `release` 資料夾(根據你的 `${buildType}` 決定);第二個是告訴 CMake 我們預設的專案建置器要使用 Ninja,如果沒設定的話預設會是使用 Visual Studio 來產生專案檔,個人是推薦使用 Ninja,其安裝方式可以參考[這裡](#安裝-Ninja)。
再來就是定義路徑,我們必須告訴 CMake 兩件事情,分別是 ninja 以及 vcpkg 的路徑(如果 ninja 有設定環境變數的話就不需要特別寫了),如果都是按造此教學方式的話路徑基本上就是如同上方所示了。
> 通常只要有重新設定 CMake 的相關設定,為了確保能正確運作,我一律都先建議先清除掉 CMake 快取,可以在 VS Code 按下 `Ctrl` + `P`,並輸入 `>CMake:`,就會跳出相關的選項,選擇【CMake: 刪除快取並重新設定】選項,就可以把 CMake 快取刪除並將會重新產生

> 但如果還是有發生無法編譯的問題的話,就再執行看看【CMake: 重設 CMake 工具延伸模組狀態(進行疑難排解)】選項,基本上它會整個重新啟動 VS Code,有些問題通常這樣可以獲得解決。

### Jetbrain CLion
CLion 是一個相當好用的 IDE,這個一般來說不是免費的,但如果你是海大學生通常都可以透過學校註冊來免費使用一波,所以相當佛心。
使用上也很簡單,使用 CLion 開啟 CMake 專案後,請按下左上角的齒輪圖示,並按下【Settings】:

接著選擇【Build, Execution, Deployment】,並且點選【CMake】:

之後跳出以下畫面,你只需要在 `CMake options` 加上指定你自己安裝的 vcpkg 套件路徑,例如:`-DCMAKE_TOOLCHAIN_FILE=C:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake`,這樣就設定完成了。

> 你也可以設定多一個 release 的設定檔,而且你也可以自己定義 `Build Directory`。
#### 重新產生 CMake 快取
至於如何在 CLion 底下重新產生 CMake 快取,可以透過【Tools】->【CMake】->【Reset Cache and Reload Project】來達成:

#### 選擇 x64 編譯器
一樣到 CLion 的設定,左邊選擇【Build, Execution, Deployment】,並且點選【Toolchains】,右邊可以發現 CLion 基本上會自動抓取你電腦預設的編譯器(通常是 MSVC),通常這邊的 Architecture 預設應該是:`amd64`,如果不是的話記得改過來!

### CMake 指令建置
這邊是寫給如果你是很喜歡使用終端機來操作的話,其實你是可以完全使用 CMake 指令來產生快取、建置專案、甚至編譯程式,其步驟如下:
1. 基本上指令為,第一步產生 CMake 快取並建置:
```bash
cmake -S <專案根目錄> -B build/Debug \
-D CMAKE_BUILD_TYPE=<Debug|Release> \
-D CMAKE_TOOLCHAIN_FILE=[你的 vcpkg 安裝路徑]/scripts/buildsystems/vcpkg.cmake \
-G Ninja
```
* 參數 `-S`:代表定義你的專案根目錄路徑,一般來說就是 `CMakeLists.txt` 的所處根目錄,你可以直接寫 `.` 以相對路徑來代表當前工作目錄,或是使用絕對路徑。
* 參數 `-B`:代表定義你的建置目錄位置,一般來說會是 `build/Debug` 或 `out/Debug`。
* 參數 `-D`:定義 CMake 的變數,例如你可以控制 `CMAKE_BUILD_TYPE` 來決定你要產生 Debug 模式編譯還是 Release 模式;或者透過 `CMAKE_TOOLCHAIN_FILE` 告訴你的 CMake 你的 vcpkg 路徑在哪裡。
* 參數 `-G`:定義你的專案建置器,你可以使用 Unix 的 Makefile、或是 Ninja、抑或是 Visual Studio 的解決方法(.sln),這邊範例使用 Ninja。
2. 第二步就是開始編譯程式來產生執行檔:
```bash
cmake --build build/Debug
```
3. 第三步驟通常就是編譯完了之後,到 Build Directory 下執行可執行檔即可運行程式!
------------------------------------------------------------
## 如何使用 vcpkg
### 搜尋套件
```bash
$ vcpkg search [套件名稱]
```
### 安裝套件
```bash
$ vcpkg install <套件名稱>
```
* 有些套件可能有其他的實做模式,例如 imgui 就有專門設計給 glut、glfw、sdl2 等不同框架的實做,套件的呈現的模式會長如下:
```bash
# 沒有列出所有的套件,想要最詳細的話可以輸入以下指令查詢。
$ vcpkg search imgui
> imgui
> imgui[glut-binding]
> imgui[glfw-binding]
> imgui[sdl2-binding]
> imgui[opengl2-binding]
> imgui[opengl3-binding]
```
這個時候安裝的時候,如果先前已經有安裝到其他的 imgui 實做版本,後面就會要求再加上 `--recurse` 參數,意思是安裝好該套件後會自動重新建置 cmake。
```bash
$ vcpkg install <套件名稱> --recurse
```
什麼時候需要加上此參數呢?當你遇到如圖以下的訊息時,就需要加上該參數。

### triplet 的指定,這個部份很重要!
```bash
# 你可以指定安裝特定的 triplet(例如 64 位元),一般而言會自動去偵測作業系統而定。
$ vcpkg install <套件名稱> --triplet=x64-windows
```
**!!!注意!!!**:triplet 本身會依造你的作業系統去決定其預設值,通常來說會如以下表格:
| 作業系統 | 預設編譯器 | Triplet |
| -------- | -------- | -------- |
| Windows | MSVC | x86-windows |
| Linux | gcc | x64-linux |
| macOS | clang or gcc | x64-osx |
而 Windows 上預設是安裝 `x86-windows`(32位元),建議一律安裝 `x64-windows`(64 位元)的套件,如果你都只安裝 32 位元的話,那進行編譯的時候也就只能編譯出 32 位元的程式。
> 如果你是在 Windows 上想使用 Mingw 的 gcc 編譯的話,Triplet 請改成 `x64-mingw-dynamic`,其原因是因為不同編譯器所編譯出來的套件原則上是不能共用的,所以就算你是 Windows 作業系統,但一旦你的編譯器是使用 gcc 的話就會需要安裝這個 triplet,而且要注意你的 gcc 必須要能夠支援編譯 64 位元的程式,建議可以安裝 TDM-64-GCC,詳情請[看這](#編譯器-就是不爽用-MSVC)
如果你想了解更多的 `triplet` 設定請輸入以下指令:
```bash
$ vcpkg help triplet
```
### 刪除套件
```bash
$ vcpkg remove <套件名稱>
# 或者刪除已經過時的套件
$ vcpkg remove <套件名稱> --outdated
```
### 查看目前已安裝的套件
```bash
$ vcpkg list
```
### 更新套件
```bash
# 顯示所有需要更新的套件
$ vcpkg update
# 列出需要重新建置已經過時的套件(因為安全機制的關係)
$ vcpkg upgrade
# 如果真的要重新建置的話,需要加上參數
$ vcpkg upgrade --no-dry-run
```
### 更新 vcpkg
如果你的 vcpkg 版本過舊,那就算有套件更新,vcpkg 也不會知道也就無法更新至最新版本,所以必須要先更新 vcpkg,再來更新套件,而更新 vcpkg 的方式就是使用 git:
```bash
# 記得要先切換根目錄到 C:\dev\vcpkg 底下
$ git pull
```
### 重新建置 vcpkg
```bash
# 有時候 git 更新了之後需要再次重新建置 vcpkg.exe (執行批次檔,Window Only)
$ .\bootstrap-vcpkg.bat
# 或者(執行 shell 腳本,專門給 Linux 或 macOS使用)
$ ./vcpkg/bootstrap-vcpkg.sh
```
------------------------------------------------------------
## 安裝 vcpkg 套件
### 以 GLUT 為主的版本
```bash
$ vcpkg install freeglut glm imgui[opengl2-binding,glut-binding] --triplet=[請選擇你需要的 triplet] --recurse
```
> 不知道你的 Triplet 該如何選擇的請仔細看[這裡](#如何使用-vcpkg)。
#### 如果你是 macOS 的話
macOS 本身似乎有些狀況,如果發現無法正常安裝 freeglut 套件的話,可能會需要先使用 homebrew 安裝幾個 freeglut 會需要用的套件,指令如下:
```bash
$ brew install mesa-glu libx11 xinput
```
安裝完成後,理論上就能正常透過 vcpkg 來安裝 freeglut 了,但記得蘋果跟別人不一樣,在 `.c` 或 `.cpp` 程式裡面要引用 glut 的標頭檔不能使用 `#include <GL/glut.h>` 或 `#include <GL/freeglut.h>`,必須要使用 `#include <GLUT/glut.h>` 才行,或者改成下方程式碼:
```c=
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/freeglut.h>
#endif
```
### 以 GLFW 為主的版本
經過我的實測,似乎透過 vcpkg 在安裝 glfw3 套件時,會要求你透過 Homebrew 安裝 pkg-config 這個套件,基本上就安裝該套件就可以解決了:
```bash
$ brew install pkg-config
```
確認安裝成功之後再來輸入:
```bash
$ vcpkg install glfw3 glad glm imgui[opengl3-binding,glfw-binding] --triplet=[請選擇你需要的 triplet] --recurse
```
> 不知道你的 Triplet 該如何選擇的請仔細看[這裡](#如何使用-vcpkg)。
另外你的 GLFW 創建 OpenGL Context 時,程式必須多加上一行:
```cpp=
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
```
### 以 SDL2 為主的版本
```bash
$ vcpkg install sdl2 sdl2-image[libjpeg-turbo] glad glm imgui[opengl3-binding,sdl2-binding] --triplet=[請選擇你需要的 triplet] --recurse
# 可選套件(支援音效、網路以及字體的相關函式庫)
$ vcpkg install sdl2-mixer sdl2-net sdl2-ttf --triplet=[請選擇你需要的 triplet]
```
> 不知道你的 Triplet 該如何選擇的請仔細看[這裡](#如何使用-vcpkg)。
另外你的 SDL2 創建 OpenGL Context時,程式必須多加上一行:
```cpp=
#ifdef __APPLE__
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);
#endif
```
#### 如果你使用的是 Linux 的話
你可能會需要透過套件管理器安裝一些套件:
* Ubuntu / Debian / popOS
```
$ sudo apt-get install libsdl2-dev libglm-dev
```
* Fedora / CentOS
```
$ sudo dnf install SDL2-devel glm-devel
```
------------------------------------------------------------
#####
國立臺灣海洋大學 資訊工程學系 電腦圖學實驗室 Lab 503
**課程名稱**:電腦圖學
**授課教授**:翁世光 教授
**課程助教**:張竣傑
###### tags: `OpenGL`