OpenGL 是一个跨平台 API,但是它非常特定于在现有图形上下文上执行图形操作,并且不包括创建这样的上下文或处理窗口事件或任何其他需要与平台特定功能集成的东西。这留给平台特定的 API。
每个平台的 OpenGL 实现将包括用于执行必要任务的平台特定 API。Windows 有 WGL,X11 有 GLX,OS X 有低级别的 CGL 或高级别的 NSOpenGLView。如果没有在某些级别上使用这些特定于平台的 API,就无法使用 OpenGL。此外,仅仅获得任何类型的 GUI 都需要这种特定于平台的相同类型的代码。
有些项目包装了各种特定于平台的 API,以提供可移植的 API 来创建上下文并处理 OpenGL 范围之外的窗口和其他事件。开始使用 OpenGL 时最常用的一种是 GLUT。OS X 提供了一个带有 GLUT 的框架,但是它还没有更新为使用 OS X 最新的 OpenGL 支持,并且仍然停留在 OpenGL 2.x 上。在 2.x 和 3.x 之间引入了 OpenGL Core 配置文件后,OpenGL API 发生了很大变化。这意味着您目前不能使用 GLUT 在 OS X 上编写现代 OpenGL 程序。
此外,由于其跨平台特性,GLUT 永远无法提供符合平台标准的体面的 GUI。提供一个像样的 GUI 总是意味着直接使用特定于平台的 API,或者至少在设计 GUI 时考虑到特定的平台。
平台之间的另一个区别是,在 OS X 上,您可以使用任何支持的 OpenGL 版本,只需包括标准 OpenGL 头文件和调用函数并使用标识符,就像使用任何其他库一样。在 Windows 上,OpenGL 标头不提供任何超过 OpenGL 1.2 的东西,这是古老的,并且使用任何更新的 OpenGL 工具意味着通过 OpenGL 的扩展机制访问它。还有另一个库 GLEW,旨在使在这些情况下使用 OpenGL 变得可以忍受。
所以 OpenGL 是一个跨平台的 API,但您很可能需要在核心 OpenGL 代码周围使用一些特定于平台的代码才能有效地使用它。GLUT 可能是一个很好的跨平台选项,至少对于学习 OpenGL 来说是这样,只是它尚未在 OS X 上更新以支持 OpenGL 3.x 引入的 OpenGL Core 配置文件。但即使使用 GLUT,您也必须通过 OpenGL 扩展机制或直接通过最新的标头来处理访问 OpenGL 设施的方式的差异。