1. 程式人生 > >OpenGL學習筆記(2)-- openGL的配置和初步使用

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語言庫,能夠提供給一個視窗和上下文用來渲染,節省書寫作業系統相關程式碼的時間。 首先去

GLFW官網下載,我下載的是針對windows預先編譯好的二進位制檔案。(之前按照教程走了很多彎路)。在工程目錄下新建資料夾openGL,在openGL中再新建一個include資料夾和libs資料夾。把GLFW解壓出來的資料夾中的include資料夾下的GLFW資料夾直接拷貝到之前新建的include資料夾中,把lib-mingw-w64資料夾下的三個檔案拷貝到libs資料夾中。

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安裝好的話,應該可以直接用的。