1. 程式人生 > >OpenGL學習筆記(七):建立第一個Qt5.9.3 OpenGL工程模版(與平臺無關)

OpenGL學習筆記(七):建立第一個Qt5.9.3 OpenGL工程模版(與平臺無關)

        main.cpp中輸入原始碼,原始碼如下:

#include <iostream>
#include <process.h>
#include <GLFW/glfw3.h>
#include <glad/glad.h>
#include <windows.h>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

// 在GLFW中實現一些輸入控制,使用GLFW的glfwGetKey函式
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}


int main()
{
    glfwInit();
    /*
       請確認您的系統支援OpenGL3.3或更高版本,否則此應用有可能會
       崩潰或者出現不可預知的錯誤。如果想要檢視OpenGL版本的話,
       在Linux上執行glxinfo,或者在Windows上使用其它的工具(例如
       OpenGL Extension Viewer)。如果你的OpenGL版本低於3.3,檢
       查一下顯示卡是否支援OpenGL 3.3+(不支援的話你的顯示卡真的太老
       了),並更新你的驅動程式,有必要的話請更新顯示卡。
    */
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    // 如果使用的是Mac OS X系統,你還需要加下面這行程式碼到你的
    // 初始化程式碼中這些配置才能起作用
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

    // 建立一個視窗物件,這個視窗物件存放了所有和視窗相關的資料,
    // 而且會被GLFW的其他函式頻繁地用到
    // glfwCreateWindow函式需要視窗的寬和高作為它的前兩個引數。
    // 第三個引數表示這個視窗的名稱(標題),最後兩個引數暫時忽略。
    // 函式會返回一個GLFWwindow物件,我們會在其它的GLFW操作中使用到。
    GLFWwindow* window = glfwCreateWindow(800, 600, "QQ:21497936", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

    // GLAD是用來管理OpenGL的函式指標的,所以在呼叫任何OpenGL的函式
    // 之前我們需要初始化GLAD。
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // 還需要註冊這個函式,告訴GLFW我們希望每當視窗調整大小的時候呼叫這個函式。
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    // 我們必須告訴OpenGL渲染視窗的尺寸大小,即視口(Viewport),
    // 這樣OpenGL才只能知道怎樣根據視窗大小顯示資料和座標。
    // 可以通過呼叫glViewport函式來設定視窗的維度(Dimension)。
    // OpenGL幕後使用glViewport中定義的位置和寬高進行2D座標的轉
    // 換,將OpenGL中的位置座標轉換為你的螢幕座標。例如,OpenGL
    // 中的座標(-0.5, 0.5)有可能(最終)被對映為螢幕中的座標(200,450)。
    // 注意,處理過的OpenGL座標範圍只為-1到1,因此我們事實上
    // 將(-1到1)範圍內的座標對映到(0, 800)和(0, 600)。
    glViewport(0, 0, 800, 600);

    // 在我們主動關閉它之前不斷繪製圖像並能夠接受使用者輸入。因此,
    // 需要在程式中新增一個while迴圈,我們可以把它稱之為渲染迴圈(Render Loop),
    // 它能在我們讓GLFW退出前一直保持執行。
    while (!glfwWindowShouldClose(window))
    {
        // 捕捉輸入
        processInput(window);
        // 清空顏色緩衝
        // 新增渲染指令,背景RGBA的A不生效
        glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 檢查並呼叫事件,交換緩衝(執行交換快取才會更新新資料到介面)
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // 當渲染迴圈結束後我們需要正確釋放/刪除之前的分配的所有資源。
    glfwTerminate();
    return 0;
}

        編譯時遇到錯誤,找不到一些函式: