OpenGL ES之GLFW窗口搭建


概述

  本章節主要總結如何使用GLFW來創建Opengl窗口。主要包括如下內容:

OpenGL窗口創建介紹

  能用於OpenGL的窗口庫有很多,常見的有glut、freeglut、SDL、GLFW等。glut基本已經被廢棄,其他幾個再不同場合都有不同的應用。GLFW為opengl superbible 6th & 7th中推薦的第三方開源窗口庫。GLFW的特點大概總結如下

  1. 跨平台,能在window、Linux和wayland中使用;
  2. 支持OpenGL、OpenGL ES;
  3. 底層的可配置性;

  下面我們來實際看下使用GLFW的實際意義。

  OpenGL ES在嵌入式開發中實際比在PC上開發opengl的環境搭建似乎要復雜很多,通常嵌入式開發中使用EGL創建OpenGL渲染的surface,使用wayland創建窗口的surface來實現。在實際開發過程中,我們想通過在PC上開發EGL + OpenGl ES的程序,這個時候,如果平台不同,我們往往在不同平台上實現不同的窗口,如:

  1. window:OpenGL ES + EGL + Window系統窗口(實際運行還需要加OpenGL ES的模擬器,OpenGL.ES.3.0.Programming.Guide中有介紹高通芯片等模擬器的使用的章節);
  2. Linux: OpenGL ES + EGL + X11窗口;
  3. 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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM