創(chuàng)建一個窗口
窗口
在創(chuàng)建窗口之前,首先需要使用glfwInit()來初始化GLFW庫,若成功返回GLFW_TRUE,失敗返回GLFW_FALSE。如果該函數(shù)失敗,它還會在返回之前調用glfwTerminate()。如果成功,你應該在應用程序退出之前手動調用glfwTerminate()。在成功初始化但應用程序尚未終止之前,對該函數(shù)的額外調用將立即返回GLFW_TRUE。
初始化之后,應使用glfwWindowHint()來配置GLFW。它有兩個參數(shù),第一個是需要配置的選項的名稱,第二個是選項的值。一般會選擇配置GLFW的版本和使用模式。
接下來使用glfwCreateWindow()創(chuàng)建一個窗口對象。

glfwCreateWindow()的前三個參數(shù)分別是窗口的寬度、高度和標題;第四個參數(shù)是用于全屏顯示的監(jiān)視器(可以為NULL,表示窗口化),第五個參數(shù)是與新創(chuàng)建的窗口共享資源的窗口(可以為NULL)。如果窗口創(chuàng)建成功,返回一個指向GLFWwindow對象的指針,否則返回NULL。
創(chuàng)建好窗口之后,我們就需要使用函數(shù)glfwMakeContextCurrent()把這個窗口的上下文設置為當前線程的主上下文(一個應用程序可以同時創(chuàng)建多個窗口,每個窗口都有一個對應的上下文)。

視口
視口(Viewport)是指OpenGL渲染的目標窗口上的可見區(qū)域。我們用glViewport()設置視口的大小和位置。

注意:OpenGL的寬和高的坐標范圍都只有-1到1,它使用glViewport進行位置坐標和屏幕坐標的轉換。
當用戶改變窗口大小時,視口也應該被調整。glfwSetFramebufferSizeCallback()用于設置幀緩沖大?。◣彌_是用于存儲渲染的圖像的內存區(qū)域,即繪制區(qū)域的高和寬)變化時的回調函數(shù)。

回調函數(shù)callback可以這樣定義:

渲染循環(huán)
我們需要程序在關閉前不斷繪制圖像并能夠接受用戶輸入。因此,需要在程序中添加一個while循環(huán),即渲染循環(huán)(Render Loop)。

glfwPollEvents的作用是檢查并處理當前窗口的所有待處理事件,例如鍵盤輸入、鼠標輸入、窗口大小調整等。
glfwSwapBuffers的作用是交換雙緩沖區(qū)的內容。在雙緩沖機制中,繪圖操作實際上是在一個后臺緩沖區(qū)中進行的,而不是直接在屏幕上繪制。當繪制完成后,glfwSwapBuffers會將后臺緩沖區(qū)的內容與前臺緩沖區(qū)進行交換,使得繪制結果能夠顯示在屏幕上。
——————————————————————————————————————
單緩沖(Single Buffer):在單緩沖機制中,繪制操作直接在屏幕上進行,而不是在后臺緩沖區(qū)。生成的圖像不是一下子被繪制出來的,而是按照從左到右,由上而下逐像素地繪制而成的。這導致繪制較慢或復雜的圖形時,可能會產(chǎn)生可見的閃爍現(xiàn)象。這是因為在繪制一幀完成之前,用戶可能會看到繪制過程中的不完整或部分繪制的圖像。此外,如果在屏幕上的繪制操作正在進行時,用戶對窗口進行了移動、最小化或最大化等操作,可能會導致圖像撕裂。
雙緩沖(Double Buffer):雙緩沖使用兩個緩沖區(qū)——前臺緩沖區(qū)和后臺緩沖區(qū)。繪制操作首先在后臺緩沖區(qū)進行,然后通過交換緩沖區(qū),將后臺緩沖區(qū)的內容復制到前臺緩沖區(qū)并顯示在屏幕上。這樣可以避免閃爍、撕裂等問題,提供更平滑更真實的繪圖效果。
——————————————————————————————————————
退出程序
渲染循環(huán)結束后需要正確釋放和刪除已分配的所有資源——通過調用函數(shù)glfwTerminate()。