OpenGL之gult/freeglut/glew/glfw/glad的聯系與區別


OpenGL之gult/freeglut/glew/glfw/glad的聯系與區別

本篇內容主要參考了文章:https://blog.csdn.net/AvatarForTest/article/details/79199807,但是經過本人局部修改,並添加了個人見解。

 

1.OpenGL總覽

OpenGL只有框架沒有實現,換句話說就是OpenGL只有函數聲明沒有源文件實現,類似於接口和虛函數。所有的實現是顯卡生產商提供。比如NVIDIA或者AMD就要自己實現OpenGL函數內容,所以不同的生產商可以對自己的產品提供優化,畢竟代碼是自己寫的。

OpenGL函數庫相關的API有核心庫(gl),實用庫(glu),輔助庫(aux)、實用工具庫(glut),窗口庫(glx、agl、wgl)和擴展函數庫等。gl是核心,glu是對gl的部分封裝。glx、agl、wgl 是針對不同窗口系統的函數。glut是為跨平台的OpenGL程序的工具包,比aux功能強大(aux很大程度上已經被glut庫取代)。擴展函數庫是硬件廠商為實現硬件更新利用OpenGL的擴展機制開發的函數。

https://opengl.org/

 

 

2.gult

OpenGL Utility Toolkit

https://www.opengl.org/resources/libraries/glut/glut_downloads.php

里面有32位的庫文件下載,glutdlls37beta.zip,但是版本太老了,理應被時代淘汰,不推薦使用。gult最后版本v3.7beta的歷史可追溯至1998年8月,且該項目已經被廢棄。它的許可證禁止任何人發布修改后的庫代碼。

這部分函數以glut開頭,主要包括窗口操作函數,窗口初始化、窗口大小、窗口位置等函數;回調函數:響應刷新消息、鍵盤消息、鼠標消息、定時器函數等;創建復雜的三維物體;菜單函數;程序運行函數。gult對應的開源實現是freegult。

 

 

3.freeglut

FreeGLUT is a free-software/open-source alternative to the OpenGL Utility Toolkit (GLUT) library

因為OpenGL沒有窗口管理的功能,所以很多熱心的人寫了工具來支持這些功能,比如早期的glut,現在的freeglut等。

freeglut完全兼容glut,是glut的代替品,開源,功能齊全。目前來看,freeglut 3.0版本比其它版本穩定,推薦使用。帕維爾在1999年12月1日開始freeglut的開發。目前,該項目幾乎可以100%的替代原來的GLUT,只有少數差別(如,the abandonment of SGI-specific features,按鈕盒子和動態視頻分辨率)和 其他一小部分程序Bug。

http://freeglut.sourceforge.net/

 

 

4.glew

The OpenGL Extension Wrangler Library

glut或者freegult主要是OpenGL 1.0的基本函數功能;glew是使用OpenGL 2.0之后的一個工具函數。

不同的顯卡公司,也會發布一些只有自家顯卡才支持的擴展函數,你要想用這數涵數,不得不去尋找最新的glext.h,有了GLEW擴展庫,你就再也不用為找不到函數的接口而煩惱,因為GLEW能自動識別你的平台所支持的全部OpenGL高級擴展函數。也就是說,只要包含一個glew.h頭文件,你就能使用gl,glu,glext,wgl,glx的全部函數。

glew包含了OpenGL所需的核心。前面已經說過openGL的實現是顯卡生產商,那么系統如何才能找到這些實現好的函數呢?而且不同的平台函數存放地方還不同,文件結構也不同。有沒有一種方式能夠自動找到OpenGL的函數?這就是glew的作用:用來找openGL的函數,並初始化,這樣我們就能直接調用OpenGL的函數了。
http://glew.sourceforge.net/

 

 

5.glfw

glfw is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contexts and surfaces, receiving input and events.

glfw無愧於其號稱的lightweight的OpenGL框架,的確是除了跨平台必要做的事情都沒有做,所以一個頭文件,很少量的API,就完成了任務。glfw的開發目的是用於替代glut的。它是一個輕量級的,開源的,跨平台的library。支持OpenGL及OpenGL ES,用來管理窗口,讀取輸入,處理事件等。

那么glfw有何優勢呢?glut太老了,最后一個版本還是90年代的。freeglut完全兼容glut,算是glut的代替品,功能齊全,但是bug太多。穩定性也不好(不是我說的啊),glfw應運而生。

總之,glfw是glut/freegult的升級和改進。glfw是用來顯示窗口和捕捉窗口事件的一套API,可以理解成Qt和windows平台的WPF。OpenGL只是一套控制GPU的規則,並沒有對於跨平台窗口顯示和事件進行規定,所以需要一個顯示顯卡渲染的窗口,這就是glfw的作用。

https://www.glfw.org/

 

 

6.glad

Multi-Language GL/GLES/EGL/GLX/WGL Loader-Generator

glad是繼gl3w,glew之后,當前最新的用來訪問OpenGL規范接口的第三方庫。簡單說glad是glew的升級版,就是說glew比較老,glad比較新。

https://glad.dav1d.de/

 

 

7.結論與項目使用

  • 窗口管理

老產品:glut/freeglut
替代品:glfw

  • 函數加載

老產品:glew
替代品:glad

  • 項目開發,通常有三種組合

(1)freeglut+glew

(2)glfw+glew

(3)glfw+glad

其中組合1是經典,組合3比較新潮。

  • 測試
  1.  
    #include <Windows.h>
  2.  
    #include <stdio.h>
  3.  
    #include <GL/glut.h>
  4.  
     
  5.  
    int main(int argc, char** argv)
  6.  
    {
  7.  
    glutInit(&argc, argv);
  8.  
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
  9.  
    glutInitWindowSize( 300, 300);
  10.  
    glutInitWindowPosition( 100, 100);
  11.  
    glutCreateWindow( "OpenGL Version");
  12.  
     
  13.  
    const GLubyte* name = glGetString(GL_VENDOR); //返回負責當前OpenGL實現廠商的名字
  14.  
    const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一個渲染器標識符,通常是個硬件平台
  15.  
    const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回當前OpenGL實現的版本號
  16.  
    const GLubyte* gluVersion = gluGetString(GLU_VERSION); //返回當前GLU工具庫版本
  17.  
     
  18.  
    printf("OpenGL實現廠商的名字:%s\n", name);
  19.  
    printf("渲染器標識符:%s\n", biaoshifu);
  20.  
    printf("OpenGL實現的版本號:%s\n", OpenGLVersion);
  21.  
    printf("OGLU工具庫版本:%s\n", gluVersion);
  22.  
    //如果是在VS上執行,需要在return前加上:system("pause");
  23.  
    return 0;
  24.  
    }

 

 

x1.源碼和庫下載

https://download.csdn.net/download/libaineu2004/12402662

更多的詳情請訪問我的另一篇博文:

https://libaineu2004.blog.csdn.net/article/details/105308235

 

 

x2.參考文獻

  • 學習教程

https://learnopengl-cn.github.io/ ++ https://learnopengl.com/

https://github.com/JoeyDeVries/LearnOpenGL ++ https://github.com/JoeyDeVries/Cell

http://www.opengl-tutorial.org/ ++ https://github.com/opengl-tutorials/ogl

http://www.it165.net/pro/html/201504/38164.html

  • OpenGL+VS2017 環境配置(親測好使)

https://blog.csdn.net/AvatarForTest/article/details/79199807

  • 《OpenGL編程指南》

紅寶書,Khronos小組編寫的OpenGL官方權威指南

  • 《OpenGL超級寶典》

藍寶書,配套源碼使用的是freeglut+glew

  • OpenGL GUI

NanoGUI 是基於opengl以及GLFW,GLAD,NanoVG,Eigen這些庫形成的一個可視化GUI庫,在窗口的設計上非常的簡約,程序使用上也非常的方便。

https://github.com/wjakob/nanogui

https://github.com/memononen/NanoVG

https://nanogui.readthedocs.io/en/latest/

  • libqglviewer

libQGLViewer 是一個用以簡化了Qt開發OpenGL三維瀏覽器的C++庫。它提供了一些典型的3D查看器的功能,如能夠移動相機使用鼠標。

http://libqglviewer.com/

https://github.com/GillesDebunne/libQGLViewer


免責聲明!

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



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