2.GLFW創(chuàng)建窗口

一.工程相關(guān)代碼如下:

// GLCreateWindow.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)沙绝。
//

#include "stdafx.h"

#include <iostream>
using namespace std;

// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>

//GLWF 按鍵回調(diào)
void key_callback( GLFWwindow* window , int key,int scancode, int action, int mode );

int _tmain(int argc, _TCHAR* argv[])
{
    //初始化GLFW
    glfwInit();   
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR , 3);   // 主版本號(hào)
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR , 3);   // 次版本號(hào)
    glfwWindowHint(GLFW_OPENGL_PROFILE , GLFW_OPENGL_CORE_PROFILE );
    glfwWindowHint(GLFW_RESIZABLE , GL_FALSE );       // 窗口尺寸不可變    

    
    //創(chuàng)建窗口薄货,glfwCreateWindow前三個(gè)參數(shù)分別為 窗口寬和高保檐,以及標(biāo)題
    GLFWwindow* window = glfwCreateWindow(800,600 , "LearnOpenGL" , nullptr , nullptr );
    if( window == nullptr ){
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();  // 銷毀窗口和資源
        return -1;
    }
    glfwMakeContextCurrent( window );  //將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文


    //初始化GLEW
    glewExperimental = GL_TRUE;  //可以使用更多現(xiàn)代化的技術(shù)
    if( glewInit() != GLEW_OK ){
        std::cout << "Failed to initialize GLEW" << std::endl;
        return -1;
    }   


    int width , height ;
    glfwGetFramebufferSize( window , &width , &height );  //得到窗口大小

    /*  glViewport函數(shù)前兩個(gè)參數(shù)控制窗口左下角的位置月劈。第三個(gè)和第四個(gè)參數(shù)控制渲染窗口的寬度和高度(像素)
        這里也可以把glViewport設(shè)置的比 glfw 的窗口小僧界。
    */
    glViewport( 0 ,0 , width , height );



    // 通過GLFW注冊(cè)我們的函數(shù)至合適的回調(diào)
    glfwSetKeyCallback( window ,key_callback );


    while ( ! glfwWindowShouldClose(window) )
    {
        glfwPollEvents();                      // 檢查有沒有觸發(fā)什么事件

        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);  // 設(shè)置清空屏幕所用的顏色
        glClear(GL_COLOR_BUFFER_BIT);          // 清空屏幕

        glfwSwapBuffers( window );             // 交換顏色緩沖
    }

    glfwTerminate(); //釋放/刪除之前的分配的所有資源

    system("pause");
    return 0;
}

/*
    按鍵回調(diào)函數(shù)接受一個(gè)GLFWwindow指針作為它的第一個(gè)參數(shù)迅矛;
    第二個(gè)整形參數(shù)用來表示按下的按鍵;
    action參數(shù)表示這個(gè)按鍵是被按下還是釋放燕差;
    最后一個(gè)整形參數(shù)表示是否有Ctrl遭笋、Shift、Alt谁不、Super等按鈕的操作
*/
void key_callback( GLFWwindow* window , int key,int scancode, int action, int mode )
{
    // 當(dāng)用戶按下ESC鍵,我們?cè)O(shè)置window窗口的WindowShouldClose屬性為true
    // 關(guān)閉應(yīng)用程序
    if( key == GLFW_KEY_ESCAPE && action == GLFW_PRESS ){
        glfwSetWindowShouldClose(window ,  GL_TRUE );
    }
}

二.相關(guān)解析:

1. 關(guān)于 glViewport :
  • OpenGL幕后使用glViewport中定義的位置和寬高進(jìn)行2D坐標(biāo)的轉(zhuǎn)換坐梯,將OpenGL中的位置坐標(biāo)轉(zhuǎn)換為你的屏幕坐標(biāo)。例如刹帕,OpenGL中的坐標(biāo)(-0.5, 0.5)有可能(最終)被映射為屏幕中的坐標(biāo)(200,450)吵血。
  • 注意,處理過的OpenGL坐標(biāo)范圍只為-1到1偷溺,因此我們事實(shí)上將(-1到1)范圍內(nèi)的坐標(biāo)映射到(0, 800)和(0, 600)蹋辅。
2. 游戲循環(huán):
  • glfwWindowShouldClose函數(shù)在我們每次循環(huán)的開始前檢查一次GLFW是否被要求退出,如果是的話該函數(shù)返回true然后游戲循環(huán)便結(jié)束了挫掏,之后為我們就可以關(guān)閉應(yīng)用程序了侦另。
  • glfwPollEvents函數(shù)檢查有沒有觸發(fā)什么事件(比如鍵盤輸入、鼠標(biāo)移動(dòng)等)尉共,然后調(diào)用對(duì)應(yīng)的回調(diào)函數(shù)(可以通過回調(diào)方法手動(dòng)設(shè)置)褒傅。我們一般在游戲循環(huán)的開始調(diào)用事件處理函數(shù)。
  • glfwSwapBuffers函數(shù)會(huì)交換顏色緩沖(它是一個(gè)儲(chǔ)存著GLFW窗口每一個(gè)像素顏色的大緩沖)袄友,它在這一迭代中被用來繪制殿托,并且將會(huì)作為輸出顯示在屏幕上。
3. 雙緩沖(Double Buffer):
  • 應(yīng)用程序使用單緩沖繪圖時(shí)可能會(huì)存在圖像閃爍的問題剧蚣。 這是因?yàn)樯傻膱D像不是一下子被繪制出來的支竹,而是按照從左到右,由上而下逐像素地繪制而成的鸠按。最終圖像不是在瞬間顯示給用戶礼搁,而是通過一步一步生成的,這會(huì)導(dǎo)致渲染的結(jié)果很不真實(shí)目尖。
  • 為了規(guī)避這些問題馒吴,我們應(yīng)用雙緩沖渲染窗口應(yīng)用程序。緩沖保存著最終輸出的圖像瑟曲,它會(huì)在屏幕上顯示募书;而所有的的渲染指令都會(huì)在緩沖上繪制。當(dāng)所有的渲染指令執(zhí)行完畢后测蹲,我們交換(Swap)前緩沖和后緩沖莹捡,這樣圖像就立即呈顯出來,之前提到的不真實(shí)感就消除了扣甲。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篮赢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子琉挖,更是在濱河造成了極大的恐慌启泣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件示辈,死亡現(xiàn)場(chǎng)離奇詭異寥茫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)矾麻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門纱耻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芭梯,“玉大人,你說我怎么就攤上這事弄喘【链” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蘑志,是天一觀的道長(zhǎng)累奈。 經(jīng)常有香客問我,道長(zhǎng)急但,這世上最難降的妖魔是什么澎媒? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮波桩,結(jié)果婚禮上戒努,老公的妹妹穿的比我還像新娘。我一直安慰自己突委,他們只是感情好柏卤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匀油,像睡著了一般缘缚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敌蚜,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天桥滨,我揣著相機(jī)與錄音,去河邊找鬼弛车。 笑死齐媒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纷跛。 我是一名探鬼主播喻括,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼贫奠!你這毒婦竟也來了唬血?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤唤崭,失蹤者是張志新(化名)和其女友劉穎拷恨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谢肾,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腕侄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冕杠。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡微姊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拌汇,到底是詐尸還是另有隱情柒桑,我是刑警寧澤弊决,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布噪舀,位于F島的核電站,受9級(jí)特大地震影響飘诗,放射性物質(zhì)發(fā)生泄漏与倡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一昆稿、第九天 我趴在偏房一處隱蔽的房頂上張望纺座。 院中可真熱鬧,春花似錦溉潭、人聲如沸净响。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馋贤。三九已至,卻和暖如春畏陕,著一層夾襖步出監(jiān)牢的瞬間配乓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工惠毁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留犹芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓鞠绰,卻偏偏與公主長(zhǎng)得像腰埂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜈膨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容