本篇內容主要參考了文章: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的擴展機制開發的函數。
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的作用。
6.glad
Multi-Language GL/GLES/EGL/GLX/WGL Loader-Generator
glad是繼gl3w,glew之後,當前最新的用來訪問OpenGL規範接口的第三方庫。簡單說glad是glew的升級版,就是說glew比較老,glad比較新。
7.結論與項目使用
- 窗口管理
老產品:glut/freeglut
替代品:glfw
- 函數加載
老產品:glew
替代品:glad
- 項目開發,通常有三種組合
(1)freeglut+glew
(2)glfw+glew
(3)glfw+glad
其中組合1是經典,組合3比較新潮。
x1.源碼和庫下載
請訪問我的另一篇博文:
https://libaineu2004.blog.csdn.net/article/details/105308235
x2.參考文獻
學習教程
https://learnopengl-cn.github.io/
OpenGL超級寶典visual studio 2013開發環境配置 GLTools
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