日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL第三方库:GLFW入门篇

發(fā)布時間:2025/3/21 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL第三方库:GLFW入门篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言:GLFW是繼GLUT,FreeGLUT之后,當前最新的用來創(chuàng)建OpenGL上下文,以及操作窗口的第三方庫。官方網(wǎng)址為:http://www.glfw.org/。

錯誤處理機制:在使用GLFW之前,有必要設(shè)置一個錯誤處理機制,這樣如果出現(xiàn)任何問題,GLFW都可以及時的告知我們。設(shè)置接口定義如下:
GLFWWerrorfun* glfwSetErrorCallback(GLFWWerrorfun cbfunc)
其中錯誤回調(diào)函數(shù)的聲明如下所示:
void ExampleGLFWerrorfun(int error, const char* description):
.error將被設(shè)置為GLFW的某個錯誤編碼值。
.description中包含一個字符串,用于描述錯誤的原因。

GLFW使用步驟:GLFW可以使OpenGL創(chuàng)建窗口變得十分簡單,只需要簡單四個步驟就可以完成創(chuàng)建窗口。流程如下:
1.初始化GLFW庫。
2.創(chuàng)建一個GLFW窗口以及OpenGL環(huán)境。
3.渲染你的場景。
4.將輸出結(jié)果呈現(xiàn)給用戶。

初始化并創(chuàng)建窗口:常用接口如下:
1.int glfwInit(void):必須在其他任何GLFW函數(shù)之前被調(diào)用,因為它負責初始化整個GLFW庫。如果成功的話,該接口將返回GL_TRUE,否則就會返回GL_FALSE。

2.GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share):負責創(chuàng)建一個新的OpenGL環(huán)境和窗口。
.monitor非NULL的話,窗口會被全屏創(chuàng)建到指定的監(jiān)視器上,分辨率由width和height來指定。否則窗口會被創(chuàng)建到桌面上,并且尺寸由width和height來指定。
.title是一個UTF-8字符串的指針,可以用來創(chuàng)建窗口的初始標題。
.share非NULL的話,新創(chuàng)建的窗口所關(guān)聯(lián)的OpenGL環(huán)境將與share所給定的關(guān)聯(lián)環(huán)境共享資源。

3.void glfwMakeContextCurrent(GLFWwindow* window):設(shè)置參數(shù)window中的窗口所關(guān)聯(lián)的OpenGL環(huán)境為當前環(huán)境。這個環(huán)境在當前線程中會一直保持為當前環(huán)境,直到另一個環(huán)境被設(shè)置為當前環(huán)境,或者窗口被刪除為止。

4.int glfwWindowShouldClose(GLFWwindow* window):如果用戶準備關(guān)閉參數(shù)window所指定的窗口,那么此接口將會返回GL_TRUE,否則將會返回GL_FALSE。

5.void glfwSwapBuffers(GLFWwindow* window):請求窗口系統(tǒng)將參數(shù)window關(guān)聯(lián)的后緩存畫面呈現(xiàn)給用戶。通常這一步是通過窗口的前后緩存的交換完成的。也可能是在一個“預備顯示”的幀緩存隊列中進行截取,窗口系統(tǒng)可能需要等待一次垂直刷新事件完成,再顯示幀的內(nèi)容。

6.void glfwPollEvents(void):告訴GLFW檢查所有等待處理的事件和消息,包括操作系統(tǒng)和窗口系統(tǒng)中應當處理的消息。如果有消息正在等待,它會先處理這些消息再返回;否則該函數(shù)會立即返回。

7.void glfwWaitEvents(void):等待一個或多個事件傳遞到應用程序,并且處理它們再返回。對應的調(diào)用線程在事件到達之前會保持睡眠狀態(tài)。

處理用戶輸入:主要是對鍵盤和鼠標的用戶輸入進行處理。常見接口如下:
1.GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun):設(shè)置一個新的鍵盤消息回調(diào)函數(shù)cbfun給指定的窗口window。如果按下或者放開鍵盤按鍵,系統(tǒng)會調(diào)用這個函數(shù)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中鍵盤消息回調(diào)函數(shù)的聲明如下所示:
void ExampleGLFWkeyfun(GLFWwindow* window, int key, int scancode, int action, int mods):
.window就是接受到鍵盤消息的窗口句柄。
.key是按下或者松開的鍵盤按鍵。
.scancode是一個系統(tǒng)平臺相關(guān)的鍵位掃描碼信息。
.action可以是GLFW_PRESS(按下鍵),GLFW_RELEASE(松開鍵),GLFW_REPEAT(連續(xù)輸入模式)中的一個。
.mods對應著輔助鍵的設(shè)置,例如shift和ctrl是否同時被按下。

2.int glfwGetKey(GLFWwindow* window, int key):返回指定窗口window中指定按鍵key的狀態(tài),可以是GLFW_PRESS(按下鍵),GLFW_RELEASE(松開鍵),GLFW_REPEAT(連續(xù)輸入模式)中的一個。

3.GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun):設(shè)置一個新的鼠標光標位置回調(diào)函數(shù)cbfun給指定窗口window。每當鼠標光標位置發(fā)生變化的時候,這個回調(diào)函數(shù)就會被觸發(fā)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中鼠標光標位置回調(diào)函數(shù)的聲明如下所示:
void GLFWcursorposfun(GLFWwindow* window, double x, double y):
.window就是接受到鼠標光標消息的窗口句柄。
.x和y就是鼠標光標相對于窗口左上角的新位置。

4.GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun):設(shè)置一個新的鼠標按鍵回調(diào)函數(shù)cbfun給指定窗口window。當用戶按下或者松開鼠標按鍵時,這個回調(diào)函數(shù)將會被觸發(fā)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中鼠標按鍵回調(diào)函數(shù)的聲明如下所示:
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(連續(xù)輸入模式)中的一個。
.mods對應著輔助鍵的設(shè)置,例如shift和ctrl是否同時被按下。

5.int glfwGetMouseButton(GLFWwindow* window, int button):返回指定窗口window中指定鼠標鍵button的狀態(tài)。

6.GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun):設(shè)置一個新的鼠標滾輪回調(diào)函數(shù)cbfun給指定窗口window。當用戶滾動鼠標滾輪時,這個回調(diào)函數(shù)將會被觸發(fā)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中鼠標滾輪回調(diào)函數(shù)的聲明如下所示:
void GLFWscrollfun(GLFWwindow* window, double xoffset, double yoffset):
.window就是接受到鼠標滾輪消息的窗口句柄。
.xoffset和yoffset對應滾輪在x和y兩個方向的運動。

控制窗口屬性:可以在創(chuàng)建窗口時進行指定,也可以在程序中進行指定。常用接口如下:
1.void glfwWindowHint(int hint, int value):設(shè)置窗口提示參數(shù)。設(shè)置以后就會影響之后創(chuàng)建的所有窗口。
.hint表示GLFW內(nèi)部定義的狀態(tài)。
.value表示狀態(tài)值。

2.void glfwDefaultWindowHints(void):恢復所有提示參數(shù)到默認值。建議在每次設(shè)置窗口提示參數(shù)之前都調(diào)用一次這個函數(shù),這樣才能保證提示參數(shù)設(shè)置值不發(fā)生混亂。

3.void glfwSetWindowSize(GLFWwindow* window, int width, int height):設(shè)置窗口的尺寸大小。
.window表示操作的窗口句柄。
.width和height表示窗口的寬高大小。

4.void glfwGetWindowSize(GLFWwindow* window, int* width, int* height):獲取窗口當前的尺寸大小。
.window表示操作的窗口句柄。
.width和height表示保存窗口寬高大小的地址。

5.GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun):設(shè)置一個新的窗口大小回調(diào)函數(shù)cbfun給指定窗口window。當窗口大小發(fā)生變化時,這個回調(diào)函數(shù)將會被觸發(fā)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中窗口大小回調(diào)函數(shù)的聲明如下所示:
void GLFWwindowsizefun(GLFWwindow* window, int width, int height):
.window表示操作的窗口句柄。
.width和height表示窗口的寬高大小。

6.void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos):設(shè)置窗口的坐標位置。
.window表示操作的窗口句柄。
.xpos和ypos表示窗口的橫縱坐標。

7.void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos):獲取窗口當前位置。
.window表示操作的窗口句柄。
.xpos和ypos表示保存窗口橫縱坐標的地址。

8.GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun):設(shè)置一個新的窗口坐標回調(diào)函數(shù)cbfun給指定窗口window。當窗口位置發(fā)生變化時,這個回調(diào)函數(shù)將會被觸發(fā)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中窗口坐標回調(diào)函數(shù)的聲明如下所示:
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):設(shè)置一個新的窗口幀緩存大小回調(diào)函數(shù)cbfun給指定窗口window。當窗口幀緩存大小發(fā)生變化時,這個回調(diào)函數(shù)將會被觸發(fā)。它的返回值是前一個回調(diào)函數(shù)的返回值,從而用來恢復之前的回調(diào)函數(shù)。
其中窗口幀緩存大小回調(diào)函數(shù)的聲明如下所示:
void GLFWframebuffersizefun(GLFWwindow* window, int width, int height):
.window表示操作的窗口句柄。
.width和height表示窗口幀緩存的寬高大小。

11.void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer):設(shè)置窗口關(guān)聯(lián)的用戶數(shù)據(jù)指針。這里GLFW僅做存儲,不做任何的特殊處理和應用。
.window表示操作的窗口句柄。
.pointer表示用戶數(shù)據(jù)指針。

12.void* glfwGetWindowUserPointer(GLFWwindow* window):獲取窗口關(guān)聯(lián)的用戶數(shù)據(jù)指針。
.window表示操作的窗口句柄。

清理和關(guān)閉程序:通常用在退出GLFW時進行的操作。常用接口如下:
1.void glfwDestroyWindow(GLFWwindow* window):銷毀窗口對象以及關(guān)聯(lián)的OpenGL環(huán)境。
.window表示操作的窗口句柄。

2.void glfwTerminate(void):關(guān)閉glfw庫本身。

在線例子:以下提供一個包含GLFW窗口操作的大部分接口的在線例子。
————————————————
版權(quán)聲明:本文為CSDN博主「金朝」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zjz520yy/article/details/83000081

#include <glad/glad.h> #include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow *window);// settings const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600;int main() {// glfw: initialize and configure// ------------------------------glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);#ifdef __APPLE__glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X #endif// glfw window creation// --------------------GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// glad: load all OpenGL function pointers// ---------------------------------------if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;} // render loop// -----------while (!glfwWindowShouldClose(window)){// input// -----processInput(window);// render// ------glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// -------------------------------------------------------------------------------glfwSwapBuffers(window);glfwPollEvents();}// glfw: terminate, clearing all previously allocated GLFW resources.// ------------------------------------------------------------------glfwTerminate();return 0; }// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly // --------------------------------------------------------------------------------------------------------- void processInput(GLFWwindow *window) {if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true); }// glfw: whenever the window size changed (by OS or user resize) this callback function executes // --------------------------------------------------------------------------------------------- void framebuffer_size_callback(GLFWwindow* window, int width, int height) {// make sure the viewport matches the new window dimensions; note that width and // height will be significantly larger than specified on retina displays.glViewport(0, 0, width, height); }

?

總結(jié)

以上是生活随笔為你收集整理的OpenGL第三方库:GLFW入门篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。