freeglut与GLFW介绍及其差别

2022-05-11 10:41:37 浏览数 (1)

        OpenGL可以在多种不同的平台之上运行,并且与各种不同的窗口系统配合工作。它的设计目标是作为窗口系统的补充,而不是它们功能的重复。因此,OpenGL在二维平面或三维空间中执行几何图形和图像的渲染,但是它并不对窗口进行管理,也不会处理输入事件。

        窗口操作在每个系统上都是不一样的,OpenGL 有目的地将这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义 OpenGL 上下文以及处理用户输入。幸运的是,有一些库已经提供了我们所需的功能。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。常见的库可分三类:

  1. 窗口管理库(creating and managing OpenGL windows)
    1. freeglut
    2. GLFW
    3. GLUT
  2. 多媒体库(multimedia libraries)
    1. Allegro version 5
    2. SDL
    3. SFML
    4. Ecere SDK
  3. 部件工具箱(widget toolkits)
    1. FLTK
    2. Qt
    3. wxWidgets
    4. 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》

0 人点赞