OpenGL第三方库:GLFW入门篇
前言:GLFW是繼GLUT,FreeGLUT之后,當前最新的用來創建OpenGL上下文,以及操作窗口的第三方庫。官方網址為:http://www.glfw.org/。
錯誤處理機制:在使用GLFW之前,有必要設置一個錯誤處理機制,這樣如果出現任何問題,GLFW都可以及時的告知我們。設置接口定義如下:
GLFWWerrorfun* glfwSetErrorCallback(GLFWWerrorfun cbfunc)
其中錯誤回調函數的聲明如下所示:
void ExampleGLFWerrorfun(int error, const char* description):
.error將被設置為GLFW的某個錯誤編碼值。
.description中包含一個字符串,用于描述錯誤的原因。
GLFW使用步驟:GLFW可以使OpenGL創建窗口變得十分簡單,只需要簡單四個步驟就可以完成創建窗口。流程如下:
1.初始化GLFW庫。
2.創建一個GLFW窗口以及OpenGL環境。
3.渲染你的場景。
4.將輸出結果呈現給用戶。
初始化并創建窗口:常用接口如下:
1.int glfwInit(void):必須在其他任何GLFW函數之前被調用,因為它負責初始化整個GLFW庫。如果成功的話,該接口將返回GL_TRUE,否則就會返回GL_FALSE。
2.GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share):負責創建一個新的OpenGL環境和窗口。
.monitor非NULL的話,窗口會被全屏創建到指定的監視器上,分辨率由width和height來指定。否則窗口會被創建到桌面上,并且尺寸由width和height來指定。
.title是一個UTF-8字符串的指針,可以用來創建窗口的初始標題。
.share非NULL的話,新創建的窗口所關聯的OpenGL環境將與share所給定的關聯環境共享資源。
3.void glfwMakeContextCurrent(GLFWwindow* window):設置參數window中的窗口所關聯的OpenGL環境為當前環境。這個環境在當前線程中會一直保持為當前環境,直到另一個環境被設置為當前環境,或者窗口被刪除為止。
4.int glfwWindowShouldClose(GLFWwindow* window):如果用戶準備關閉參數window所指定的窗口,那么此接口將會返回GL_TRUE,否則將會返回GL_FALSE。
5.void glfwSwapBuffers(GLFWwindow* window):請求窗口系統將參數window關聯的后緩存畫面呈現給用戶。通常這一步是通過窗口的前后緩存的交換完成的。也可能是在一個“預備顯示”的幀緩存隊列中進行截取,窗口系統可能需要等待一次垂直刷新事件完成,再顯示幀的內容。
6.void glfwPollEvents(void):告訴GLFW檢查所有等待處理的事件和消息,包括操作系統和窗口系統中應當處理的消息。如果有消息正在等待,它會先處理這些消息再返回;否則該函數會立即返回。
7.void glfwWaitEvents(void):等待一個或多個事件傳遞到應用程序,并且處理它們再返回。對應的調用線程在事件到達之前會保持睡眠狀態。
處理用戶輸入:主要是對鍵盤和鼠標的用戶輸入進行處理。常見接口如下:
1.GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun):設置一個新的鍵盤消息回調函數cbfun給指定的窗口window。如果按下或者放開鍵盤按鍵,系統會調用這個函數。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中鍵盤消息回調函數的聲明如下所示:
void ExampleGLFWkeyfun(GLFWwindow* window, int key, int scancode, int action, int mods):
.window就是接受到鍵盤消息的窗口句柄。
.key是按下或者松開的鍵盤按鍵。
.scancode是一個系統平臺相關的鍵位掃描碼信息。
.action可以是GLFW_PRESS(按下鍵),GLFW_RELEASE(松開鍵),GLFW_REPEAT(連續輸入模式)中的一個。
.mods對應著輔助鍵的設置,例如shift和ctrl是否同時被按下。
2.int glfwGetKey(GLFWwindow* window, int key):返回指定窗口window中指定按鍵key的狀態,可以是GLFW_PRESS(按下鍵),GLFW_RELEASE(松開鍵),GLFW_REPEAT(連續輸入模式)中的一個。
3.GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun):設置一個新的鼠標光標位置回調函數cbfun給指定窗口window。每當鼠標光標位置發生變化的時候,這個回調函數就會被觸發。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中鼠標光標位置回調函數的聲明如下所示:
void GLFWcursorposfun(GLFWwindow* window, double x, double y):
.window就是接受到鼠標光標消息的窗口句柄。
.x和y就是鼠標光標相對于窗口左上角的新位置。
4.GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun):設置一個新的鼠標按鍵回調函數cbfun給指定窗口window。當用戶按下或者松開鼠標按鍵時,這個回調函數將會被觸發。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中鼠標按鍵回調函數的聲明如下所示:
void GLFWmousebuttonfun(GLFWwindow* window, int button, int action, int mods):
.window就是接受到鼠標按鍵消息的窗口句柄。
.button就是當前的鼠標鍵。其中button可以是GLFW_MOUSE_BUTTON_1到GLFW_MOUSE_BUTTON_8中的一個值。
.action就是可以是GLFW_PRESS(按下鍵),GLFW_RELEASE(松開鍵),GLFW_REPEAT(連續輸入模式)中的一個。
.mods對應著輔助鍵的設置,例如shift和ctrl是否同時被按下。
5.int glfwGetMouseButton(GLFWwindow* window, int button):返回指定窗口window中指定鼠標鍵button的狀態。
6.GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun):設置一個新的鼠標滾輪回調函數cbfun給指定窗口window。當用戶滾動鼠標滾輪時,這個回調函數將會被觸發。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中鼠標滾輪回調函數的聲明如下所示:
void GLFWscrollfun(GLFWwindow* window, double xoffset, double yoffset):
.window就是接受到鼠標滾輪消息的窗口句柄。
.xoffset和yoffset對應滾輪在x和y兩個方向的運動。
控制窗口屬性:可以在創建窗口時進行指定,也可以在程序中進行指定。常用接口如下:
1.void glfwWindowHint(int hint, int value):設置窗口提示參數。設置以后就會影響之后創建的所有窗口。
.hint表示GLFW內部定義的狀態。
.value表示狀態值。
2.void glfwDefaultWindowHints(void):恢復所有提示參數到默認值。建議在每次設置窗口提示參數之前都調用一次這個函數,這樣才能保證提示參數設置值不發生混亂。
3.void glfwSetWindowSize(GLFWwindow* window, int width, int height):設置窗口的尺寸大小。
.window表示操作的窗口句柄。
.width和height表示窗口的寬高大小。
4.void glfwGetWindowSize(GLFWwindow* window, int* width, int* height):獲取窗口當前的尺寸大小。
.window表示操作的窗口句柄。
.width和height表示保存窗口寬高大小的地址。
5.GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun):設置一個新的窗口大小回調函數cbfun給指定窗口window。當窗口大小發生變化時,這個回調函數將會被觸發。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中窗口大小回調函數的聲明如下所示:
void GLFWwindowsizefun(GLFWwindow* window, int width, int height):
.window表示操作的窗口句柄。
.width和height表示窗口的寬高大小。
6.void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos):設置窗口的坐標位置。
.window表示操作的窗口句柄。
.xpos和ypos表示窗口的橫縱坐標。
7.void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos):獲取窗口當前位置。
.window表示操作的窗口句柄。
.xpos和ypos表示保存窗口橫縱坐標的地址。
8.GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun):設置一個新的窗口坐標回調函數cbfun給指定窗口window。當窗口位置發生變化時,這個回調函數將會被觸發。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中窗口坐標回調函數的聲明如下所示:
void GLFWwindowposfun(GLFWwindow* window, int xpos, int ypos):
.window表示操作的窗口句柄。
.xpos和ypos表示窗口的橫縱坐標。
9.void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height):獲取窗口幀緩存尺寸大小。
.window表示操作的窗口句柄。
.width和height表示保存窗口幀緩存寬高大小的地址。
10.GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun):設置一個新的窗口幀緩存大小回調函數cbfun給指定窗口window。當窗口幀緩存大小發生變化時,這個回調函數將會被觸發。它的返回值是前一個回調函數的返回值,從而用來恢復之前的回調函數。
其中窗口幀緩存大小回調函數的聲明如下所示:
void GLFWframebuffersizefun(GLFWwindow* window, int width, int height):
.window表示操作的窗口句柄。
.width和height表示窗口幀緩存的寬高大小。
11.void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer):設置窗口關聯的用戶數據指針。這里GLFW僅做存儲,不做任何的特殊處理和應用。
.window表示操作的窗口句柄。
.pointer表示用戶數據指針。
12.void* glfwGetWindowUserPointer(GLFWwindow* window):獲取窗口關聯的用戶數據指針。
.window表示操作的窗口句柄。
清理和關閉程序:通常用在退出GLFW時進行的操作。常用接口如下:
1.void glfwDestroyWindow(GLFWwindow* window):銷毀窗口對象以及關聯的OpenGL環境。
.window表示操作的窗口句柄。
2.void glfwTerminate(void):關閉glfw庫本身。
在線例子:以下提供一個包含GLFW窗口操作的大部分接口的在線例子。
————————————————
版權聲明:本文為CSDN博主「金朝」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zjz520yy/article/details/83000081
?
總結
以上是生活随笔為你收集整理的OpenGL第三方库:GLFW入门篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL之GLFW入门学习
- 下一篇: OpenGL开发学习指南一(freegl