OpenGL可以在多种不同的平台之上运行,并且与各种不同的窗口系统配合工作。它的设计目标是作为窗口系统的补充,而不是它们功能的重复。因此,OpenGL在二维平面或三维空间中执行几何图形和图像的渲染,但是它并不对窗口进行管理,也不会处理输入事件。
窗口操作在每个系统上都是不一样的,OpenGL 有目的地将这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义 OpenGL 上下文以及处理用户输入。幸运的是,有一些库已经提供了我们所需的功能。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。常见的库可分三类:
- 窗口管理库(creating and managing OpenGL windows)
- freeglut
- GLFW
- GLUT
- 多媒体库(multimedia libraries)
- Allegro version 5
- SDL
- SFML
- Ecere SDK
- 部件工具箱(widget toolkits)
- FLTK
- Qt
- wxWidgets
- Game GUI
具体信息可参考《Related toolkits and APIs》。
下面就对OpenGL窗口管理库中的freeglut与GLFW两个库进行简单介绍与对比。
1.freeglut
freeglut是OpenGL实用工具库(OpenGL Utility Toolkit, GLUT)的开源替代版本。GLUT最初是由Mark Kilgard编写的,用来支持第二版《OpenGL 编程指南》中的示例程序。 从那时起,GLUT就被广泛应用于各种实际应用中,因为它简单、可用性广、可移植性强。
2.GLFW
GLFW是一个面向OpenGL、OpenGL ES和Vulkan桌面开发的开源、多平台库。 它提供了一个简单的API来创建窗口,上下文和表面,接收输入和事件。GLFW是用C语言编写的,支持Windows, macOS, X11和Wayland。
3.freeglut与GLFW不同
它们之间最大的区别是,在处理用户输入上,FreeGLUT主要通过回调函数(Callback function),而GLFW则提供了两种输入机制即回调函数与轮询(polling)。在回调函数方式 中,用户提供给GLFW的回调函数用来处理用户输入操作如键盘按键或鼠标操作。当用户按下或者松开按键时,它都会被触发,包括一些特殊的键位(例如 Shift、Caps Lock、Esc等)。而在轮询方式中,程序可以直接查询系统中是否已经按下了任意键,或者更具体一点,是否按下了某个特定的键。它允许用户直接获取某个按键的瞬时状态,相当于用户直接询问:“这个键现在被按下了吗?”
回调函数与轮询这两种方式的最大差别,轮询方式能连续获得键盘输入,而回调函数则适用于按键速度不是特别快,不需要连续效果(比如人物不停地跑),具体可参考文[5]。另外,freeglut支持创建右键菜单,而GLFW不支持。
GLFW在输入机制上提供了更多选择,同时也增加了复杂性。而freeglut则相对较为简单,因此如果从学习OpenGL与图形学的角度来看,freeglut不失为一个合适的选择。而如果对程序的连续性输入要求较高时,则可以考虑GLFW。
参考:
[1] freeglut, The freeglut Project :: About (sourceforge.net)
[2] GLFW, An OpenGL library | GLFW
[3] Related toolkits and APIs
[4] OpenGL编程指南(第8版),(第9版)
[5] OpenGL学习笔记——GLFW处理键盘输入
[6] Appendix D. Getting Started with OpenGL in 《Learning Modern 3D Graphics Programming》