日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

使用OpenGL創建窗口的示例詳解_C 語言

作者:一二三o-0-O ? 更新時間: 2022-06-18 編程語言

效果展示

在這里插入圖片描述

窗口創建并啟動渲染循環

/*
因為OpenGL只是一個標準/規范,具體的實現是由驅動開發商針對特定顯卡實現的。
由于OpenGL驅動版本眾多,它大多數函數的位置都無法在編譯時確定下來,需要在運行時查詢。
所以任務就落在了開發者身上,開發者需要在運行時獲取函數地址并將其保存在一個函數指針中供以后使用。

GLAD是一個開源的庫,它能解決我們上面提到的獲取函數地址并將其保存在一個函數指針中供以后使用繁瑣的問題
*/
#include <glad/glad.h>
/*
GLFW是一個專門針對OpenGL的C語言庫,它提供了一些渲染物體所需的最低限度的接口。它允許用戶創建OpenGL上下文、定義窗口參數以及處理用戶輸入.
*/
#include <GLFW/glfw3.h>
/*
C++標準庫
*/
#include <iostream>

// 視口修改的函數
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
    glfwInit(); 

    // 配置GLFW
    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); // MacOSX系統才需要設置

    // 創建一個窗口對象
    GLFWwindow* window = glfwCreateWindow(800,600,"LearnOpenGL",NULL,NULL);
    if (window == NULL) {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    // GLAD是用來管理OpenGL的函數指針的,所以再調用任何OpenGL的函數之前我們需要初始化GLAD
    // 我們給GLAD傳入了用來加載系統相關的OpenGL函數指針地址的函數。GLFW給我們的是glfwGetProcAddress,它根據我們編譯的系統定義了正確的函數
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }

    // 告訴OpenGL渲染窗口的尺寸大小,即視口大小
    // OpenGL幕后使用glViewport中定義的位置和寬高進行2D坐標的轉換、將OpenGL中的位置坐標轉換為你的屏幕坐標。處理過的OpenGL坐標范圍只為-1到1,然后映射到(0,800)和(0,600)
    glViewport(0,0,800,600);// 設置窗口的維度

    // 用戶改變窗口的大小的時候,視口也應該被調整
    // 對窗口注冊一個回調函數(Callback Function)
    glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);

    // 還可以將我們的函數注冊到其它很多的回調函數中。例如我們可以創建一個回調函數來處理手柄輸入變化,處理錯誤消息等。我們會在創建窗口之后,渲染循環初始化之前注冊這些回調函數

    // 添加渲染循環
    while (!glfwWindowShouldClose(window)) {// 該函數在我們每次循環的開始前檢查依次GLFW是否被要求推出,如果是的話函數返回true然后渲染循環便結束了,之后我們就可以關閉應用程序了
        // 輸入
        processInput(window);

        // 渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 設置清空屏幕所用的顏色(此函數是一個狀態設置函數)
        glClear(GL_COLOR_BUFFER_BIT);// 清除顏色緩沖(是一個狀態使用函數)

        // 檢查并調用事件,交換緩沖
        glfwSwapBuffers(window);// 函數會交換顏色緩沖(它是一個儲存著GLFW窗口每一個像素顏色值的大緩沖),它在這一迭代中被用來繪制,并且將會作為輸出顯示在屏幕上
        glfwPollEvents();// 函數檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態,并調用對應的回調函數(可以通過回調方法手動設置)。
    }
    /*雙緩沖(Double Buffer)
    應用程序使用單緩沖繪圖時可能會存在圖像閃爍的問題。 這是因為生成的圖像不是一下子被繪制出來的,而是按照從左到右,由上而下逐像素地繪制而成的。
    最終圖像不是在瞬間顯示給用戶,而是通過一步一步生成的,這會導致渲染的結果很不真實。為了規避這些問題,我們應用雙緩沖渲染窗口應用程序。
    前緩沖保存著最終輸出的圖像,它會在屏幕上顯示;而所有的的渲染指令都會在后緩沖上繪制。
    當所有的渲染指令執行完畢后,我們交換(Swap)前緩沖和后緩沖,這樣圖像就立即呈顯出來,之前提到的不真實感就消除了。
    */

    glfwTerminate();
    return 0;
}

參考資料

【1】LearnOpenGL

原文鏈接:https://blog.csdn.net/MichaelKongChina/article/details/124201572

欄目分類
最近更新