OpenGL學習筆記(2)-- openGL的配置和初步使用
引言
本文講述了筆者在VScode中配置openGL開發環境的和初步使用openGL的過程。因為實在是討厭VS的笨重和codeblocks介面的醜陋,所以花了一整天的時間成功地在VScode上配置了openGL的開發環境。其實是想玩玩VScode,自己建一個小小的工程試試。
VScode中C++環境的配置
該過程主要是參考知乎上 “Visual Studio Code如何編寫執行C、C++?” 中譚九鼎的答案。 照著做就可以了,配置完成後就可以在VScode編譯和除錯單個的C++程式。
OpenGL的配置
OpenGL用的是GLFW和GLAD搭配,主要參考的連結。
GLFW
GLFW是一個專門針對OpenGL的C語言庫,能夠提供給一個視窗和上下文用來渲染,節省書寫作業系統相關程式碼的時間。
首先去
GLAD
按照連結裡的步驟下載下來GLAD的壓縮包,通過gcc將glad.c檔案編譯成靜態庫檔案libglad.a,把標頭檔案放在工程的include中,將libglad.a放到libs資料夾裡。
編譯的設定
改變之前配置C++環境的那四個檔案
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Compile", // 任務名稱,與launch.json的preLaunchTask相對應
"command": "clang++", // 要使用的編譯器
"args": [
"${file}",
"-o", // 指定輸出檔名,不加該引數則預設輸出a.exe,Linux下預設a.out
"${fileDirname}/${fileBasenameNoExtension}.exe" ,
"-g", // 生成和除錯有關的資訊
"-Wall", // 開啟額外警告
"-static-libgcc", // 靜態連結
"-fcolor-diagnostics", // 彩色的錯誤資訊?但貌似clang預設開啟而gcc不接受此引數
"--target=x86_64-w64-mingw", // clang的預設target為msvc,不加這一條就會找不到標頭檔案;Linux下去掉這一條
"-std=c++17", // C語言最新標準為c11,或根據自己的需要進行修改
"-I${fileDirname}/openGL/include",
"-L${fileDirname}/openGL/libs",
"-lglad",
"-lglfw3",
"-lglfw3dll"
], // 編譯命令引數
"type": "shell", // 可以為shell或process,前者相當於先開啟shell再輸入命令,後者是直接執行命令
"group": {
"kind": "build",
"isDefault": true // 設為false可做到一個tasks.json配置多個編譯指令,需要自己修改本檔案,我這裡不多提
},
"presentation": {
"echo": true,
"reveal": "always", // 在“終端”中顯示編譯資訊的策略,可以為always,silent,never。具體參見VSC的文件
"focus": false, // 設為true後可以使執行task時焦點聚集在終端,但對編譯c和c++來說,設為true沒有意義
"panel": "shared" // 不同的檔案的編譯資訊共享一個終端面板
}
// "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的註釋符,並在上一條之後加個逗號。照著我的教程做的不需要改(也可以把這行刪去)
}
]
}
主要是添加了編譯時標頭檔案的路徑,和連結時庫檔案的連結。這個地方卡了我好久,主要是隻連結了libglfw3.a和libglad.a,編譯就一直報錯,然後把libglfw3dll.a也加進連結裡就通過。之後還有一步留到下面說。 這四個檔案可以參考我的github
使用OpenGL
這個時候在你的檔案裡就可以引用庫檔案了
#define GLFW_DLL
#include <glad/glad.h>
#include <GLFW/glfw3.h>
這裡有兩點要注意,glad一定要在GLFW之前,前面巨集的定義不能刪。(參照連結中”With MinGW or Visual C++ on Windows“的部分) 下面就是按照教程寫你的openGL程式了,下面是我的程式碼
#define GLFW_DLL
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdlib.h>
// 注意 glad的引用一定要在GLFW之前
using namespace std;
// 視窗大小改變時的回撥函式
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
// 輸入控制
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
int main()
{
// 初始glfw,設定版本號為3.3,使用核心模式,應用設定
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// 建立一個視窗,將視窗的上下文應用到當前的主上下文
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
cout << "Failed to create GLFW window" << endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
cout << "Failed to initialize GLAD" << endl;
return -1;
}
// 初始化渲染視窗,及視口ViewPort
glViewport(0, 0, 800, 600);
// 繫結回撥函式
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 準備引擎
// 迴圈不停的渲染,及渲染迴圈
while(!glfwWindowShouldClose(window)){
// 檢查使用者的輸入
processInput(window);
// 渲染指令
// 清空顏色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 檢查觸發事件
glfwPollEvents();
// 應用程式採用著雙緩衝模式,一張在前面顯示,一張在後面慢慢載入
// Swap交換緩衝,完成立刻重新整理
glfwSwapBuffers(window);
}
// 釋放glfw的資源
glfwTerminate();
return 0;
}
按F5編譯成功,但是執行出錯,提示缺少dll檔案,把lib裡的glfw3.dll移到當前目錄就可以運行了。 比較懶的可以直接下載我的工程原始碼,如果你的mingw和clang安裝好的話,應該可以直接用的。