1. 程式人生 > >建立一個自己的視窗

建立一個自己的視窗

  首先,引入標頭檔案,如下圖所示:

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

  定義GLEW_STATIC巨集是因為我們需要使用GLEW靜態的連結庫。iostream標頭檔案是用於輸出。

  這裡要確保GLEW的標頭檔案要寫在GLFW之前,在glew.h的標頭檔案中會引入許多OpenGL所必要的標頭檔案,所以你需要在包含其它依賴於OpenGL的標頭檔案之前先包含GLEW標頭檔案。


  接下來建立main函式來例項化GLFW:

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  
}

  首先,我們使用gifwInit()方法來初始化GLFW,接下來我們使用glfwWindowHinit()方法來配置GLFW,在這裡我們設定OpenGl的主版本號為3,次版本號也為3,即使用3.3版本的OpegGL。同時告訴GLFW我們使用的是核心模式(CORE_PROFILE)。


  然後我們來建立一個視窗物件:

    GLFWwindow *window = glfwCreateWindow(800, 600, "My OpenGL Window", NULL, NULL);
    if (window == NULL)
    {
        printf("Open Window Filed!");
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);

  glfwCreatWindow函式的前兩個引數分別表示視窗的寬和高,第三個引數為視窗的名字,後兩個引數我們暫時忽略掉,賦值為NULL即可。這個方法會返回一個GLFWwindow的物件,我們將它儲存在指標window中,它將會被其它GLFW函式所呼叫。接下來進行安全校驗,如果返回的值為空時,表示開啟視窗失敗,使用glfwTerminate()方法停止視窗的繪製並回收資源。如果返回值不為空,則通知GLFW將我們視窗的上下文設定為當前執行緒的主上下文。


  Viewport(視口)

  在開始渲染之前,我們需要設定需要繪製的視窗的大小,這樣OpemGL才知道怎麼相對於視窗大小顯示資料和座標。在這裡我們可以使用glViewport來設定視窗的維度:

glViewport(0, 0, 800, 600);

  前兩個引數表示我們繪製的視窗的左下角的位置,第三個第四個引數設定我們要渲染的視窗的寬和高(單位為畫素),數值要和我們之前設定的GLFW的視窗的寬和高相同。

  事實上,OpenGL通過glViewport中定義的座標和寬高進行轉換,將OpenGL中的位置座標轉換為我們的螢幕座標。其中處理過的OpenGL座標範圍為(-1,1),例子中我們就是將(-1,1)範圍內的座標對映到(0,800)和(0,600)


  我們當然想看到我們繪製的視窗,並讓我們的視窗接受使用者的輸入,渲染圖片什麼的,而不是讓它一閃而過。這裡我們可以使用一個while迴圈來實現:

while (!glfwWindowShouldClose(window))
    {
        glfwSwapBuffers(window);
        glfwPollEvents();  
    }

  glfwWindowShouleClose()可以在每次迴圈時判斷當前視窗是否被關閉,如果被關閉則退出迴圈,如果沒有被關閉,則使用glfwSwapBuffers()交換色彩緩衝區(在GLFW中包含每個畫素的值的緩衝區),在迴圈沒有退出時,它將會持續渲染並顯示在自己的螢幕上。glfwPollEvents方法監聽事件並作出相應的迴應(比如鍵盤的輸入和滑鼠的拖動)。

  關於雙緩衝:OplenGL的渲染是從上到下,從左到右。而雙緩衝則包括了一個前緩衝和後緩衝,前緩衝只負責將渲染的圖片顯示到螢幕上,後緩衝則負責呼叫渲染的命令,當後緩衝中的命令執行完畢之後,前緩衝和後緩衝交換位置,這樣做能夠讓圖片立刻展示在使用者面前。


 

  在結束程式之前,我們需要回收所有GLFW所呼叫的資源。程式碼如下:

   glfwTerminate();
    return 0;

  然後執行程式,我們就可以得到我們自己的視窗: