freeglut与GLFW介绍及其差别

freeglut与GLFW介绍及其差别
OpenGL可以在多种不同的平台之上运行并且与各种不同的窗口系统配合工作。它的设计目标是作为窗口系统的补充而不是它们功能的重复。因此OpenGL在二维平面或三维空间中执行几何图形和图像的渲染但是它并不对窗口进行管理也不会处理输入事件。窗口操作在每个系统上都是不一样的OpenGL 有目的地将这些操作抽象Abstract出去。这意味着我们不得不自己处理创建窗口定义 OpenGL 上下文以及处理用户输入。幸运的是有一些库已经提供了我们所需的功能。这些库节省了我们书写操作系统相关代码的时间提供给我们一个窗口和上下文用来渲染。常见的库可分三类窗口管理库(creating and managing OpenGL windows)freeglutGLFWGLUT多媒体库(multimedia libraries)Allegro version 5SDLSFMLEcere SDK部件工具箱(widget toolkits)FLTKQtwxWidgetsGame GUI具体信息可参考《Related toolkits and APIs》。下面就对OpenGL窗口管理库中的freeglut与GLFW两个库进行简单介绍与对比。1.freeglutfreeglut是OpenGL实用工具库OpenGL Utility Toolkit, GLUT的开源替代版本。GLUT最初是由Mark Kilgard编写的用来支持第二版《OpenGL 编程指南》中的示例程序。 从那时起GLUT就被广泛应用于各种实际应用中因为它简单、可用性广、可移植性强。2.GLFWGLFW是一个面向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》