欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用OpenGL創(chuàng)建窗口的示例詳解

 更新時間:2022年04月19日 10:34:34   作者:一二三o-0-O  
OpenGL,也就是Open?Graphics?Library。其主要就是用于我們去渲染2D、3D矢量圖形的一種跨語言、跨平臺的應用程序編程接口,這篇文章主要介紹了使用OpenGL創(chuàng)建窗口,需要的朋友可以參考下

效果展示

在這里插入圖片描述

窗口創(chuàng)建并啟動渲染循環(huán)

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

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

// 視口修改的函數(shù)
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系統(tǒng)才需要設置

    // 創(chuàng)建一個窗口對象
    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的函數(shù)指針的,所以再調用任何OpenGL的函數(shù)之前我們需要初始化GLAD
    // 我們給GLAD傳入了用來加載系統(tǒng)相關的OpenGL函數(shù)指針地址的函數(shù)。GLFW給我們的是glfwGetProcAddress,它根據(jù)我們編譯的系統(tǒng)定義了正確的函數(shù)
    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);// 設置窗口的維度

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

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

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

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

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

    glfwTerminate();
    return 0;
}

參考資料

【1】LearnOpenGL

到此這篇關于使用OpenGL創(chuàng)建窗口的文章就介紹到這了,更多相關OpenGL創(chuàng)建窗口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入分析父子線程、進程終止順序不同產生的結果

    深入分析父子線程、進程終止順序不同產生的結果

    本篇文章是對父子線程、進程終止順序不同產生的結果進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一文帶你學會C語言中的qsort函數(shù)

    一文帶你學會C語言中的qsort函數(shù)

    qsort函數(shù)是C語言的庫函數(shù),能實現(xiàn)對各種元素類型的比較,使用的基本思想是快速排序法,頭文件是<stdlib.h>,本文不講解具體實現(xiàn)原理,只對使用方法進行說明,希望對大家有所幫助
    2022-12-12
  • C++11中l(wèi)onglong超長整型和nullptr初始化空指針

    C++11中l(wèi)onglong超長整型和nullptr初始化空指針

    本文介紹?C++11?標準中新添加的?long?long?超長整型和?nullptr?初始化空指針,在?C++11?標準下,相比?NULL?和?0,使用?nullptr?初始化空指針可以令我們編寫的程序更加健壯,本文結合示例代碼給大家詳細講解,需要的朋友跟隨小編一起看看吧
    2022-12-12
  • 聊一聊OpenCV相機標定

    聊一聊OpenCV相機標定

    這篇文章主要為大家詳細介紹了OpenCV相機標定的相關資料,即獲得相機參數(shù)的過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 一篇文章帶你了解C++特殊類的設計

    一篇文章帶你了解C++特殊類的設計

    這篇文章主要為大家詳細介紹了C++特殊類的設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言malloc與calloc區(qū)別詳解

    C語言malloc與calloc區(qū)別詳解

    本文主要介紹了C語言malloc與calloc區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • C語言中#if的使用詳解

    C語言中#if的使用詳解

    #if和#endif是一組同時使用的,叫做條件編譯指令。#if與#define、#include等指令一樣是由預處理器這個強大的工具處理的,預處理器可以在編譯前處理c程序,這篇文章主要介紹了C語言中#if的使用,需要的朋友可以參考下
    2022-11-11
  • 基于Matlab繪制超絢麗的煙花的過程詳解

    基于Matlab繪制超絢麗的煙花的過程詳解

    這篇文章主要為大家介紹了如何利用Matlab繪制超絢麗的煙花,文中的示例代碼講解詳細,對我們學習Matlab有一定幫助,需要的可以參考一下
    2022-02-02
  • C語言實現(xiàn)簡易掃雷小游戲

    C語言實現(xiàn)簡易掃雷小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C語言將日期、時間保存到文本文件中的方法

    C語言將日期、時間保存到文本文件中的方法

    這篇文章主要給大家介紹了關于C語言將日期、時間保存到文本文件中的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C語言具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04

最新評論