OpenGL視窗 能用於OpenGL的視窗庫有很多,常見的有glut、freeglut、SDL、GLFW等。glut基本已經被廢棄,其他幾個再不同場合都有不同的應用。 GLFW為opengl superbible 6th & 7th中推薦的第三方開源視窗庫。GLFW的特點大概總結如下: 跨平臺,能在...
概述
本章節主要總結如何使用GLFW來創建Opengl視窗。主要包括如下內容:
OpenGL視窗創建介紹
能用於OpenGL的視窗庫有很多,常見的有glut、freeglut、SDL、GLFW等。glut基本已經被廢棄,其他幾個再不同場合都有不同的應用。GLFW為opengl superbible 6th & 7th中推薦的第三方開源視窗庫。GLFW的特點大概總結如下:
- 跨平臺,能在window、Linux和wayland中使用;
- 支持OpenGL、OpenGL ES;
- 底層的可配置性;
下麵我們來實際看下使用GLFW的實際意義。
OpenGL ES在嵌入式開發中實際比在PC上開發opengl的環境搭建似乎要複雜很多,通常嵌入式開發中使用EGL創建OpenGL渲染的surface,使用wayland創建視窗的surface來實現。在實際開發過程中,我們想通過在PC上開發EGL + OpenGl ES的程式,這個時候,如果平臺不同,我們往往在不同平臺上實現不同的視窗,如:
- window:OpenGL ES + EGL + Window系統視窗(實際運行還需要加OpenGL ES的模擬器,OpenGL.ES.3.0.Programming.Guide中有介紹高通晶元等模擬器的使用的章節);
- Linux: OpenGL ES + EGL + X11視窗;
- ARM: OpenGL ES + EGL + wayland視窗;
window 視窗系統、X11視窗和wayland視窗的創建和視窗事件獲取及處理方式各不相同,而GLFW所做的事情,就是提供統一的視窗創建的方法,使我們能在GLFW上開發與平臺無關的OpenGL ES代碼。
GLFW Window版編譯介紹
GLFW官網有詳細的各個平臺編譯步驟介紹,在此我們針對Window + VS2005 + EGL + Mail模擬器進行進行介紹。
- 下載CMake並安裝(官網可直接尚在安裝包進行安裝);
- 下載Mail模擬器安裝包,安裝完成後,在安裝路徑下可以看待我們在開發過程中需要用到的頭文件和相應的dll,大家可以點擊mali-cube.exe來測試自己的機器是否能正常運行此模擬器,VM虛擬機對OpenGL版本的支持比較低,一般無法運行此虛擬機,因此大家可能在虛擬機上開發OpenGL ES會受到一些障礙;
- 下載GLFW源碼,使用CMake GUI編譯GLFW;
- 在CMake安裝目錄bin下找到cmake-gui.exe並運行;
- 選擇源碼路徑和編譯路徑;
點擊Configure進行配置
完成後,我們得到了配置屬性設置項,官網有對每項配置的介紹;
配置完成後我們點擊Generate,即可完成項目文件的創建; 在build的目錄下,我們可以使用vs2005 打開GLFW.sln並編譯GLFW庫;
至此,編譯部分大致介紹完成,大家在實際編譯過程中可能會遇到其他問題,參考官網的介紹應該都能解決。
GLFW簡單工程源碼介紹
我們把GLFW編譯出來的庫和頭文件複製到我們的OpenGL ES VS工程中(當然也必須添加模擬器的Dll),如下為實例代碼:
#define GLFW_INCLUDE_ES2 #include <GLFW/glfw3.h> void errorfunc(int error, const char* discription) { fputs(discription,stderr); } void keyfunc(GLFWwindow* window, int key, int scancode, int action, int mods) //按鍵回調函數 { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) { glfwSetWindowShouldClose(window,GL_TRUE); //退出是銷毀視窗 } } int main() { GLFWwindow* windows; glfwSetErrorCallback(errorfunc); if (!glfwInit()) { exit(EXIT_FAILURE); } windows = glfwCreateWindow(600, 480, "test opengl windows", NULL, NULL); //創建視窗 if (!windows) { glfwTerminate(); } glfwMakeContextCurrent(windows); glfwSetKeyCallback(windows,keyfunc); while (!glfwWindowShouldClose(windows)) //渲染迴圈 { glClear(GL_COLOR_BUFFER_BIT); glClearColor(....); //do something about opengl glfwSwapBuffers(windows); glfwPollEvents(); } glfwDestroyWindow(windows); glfwTerminate(); return 0;