跳转到内容

OpenGL 编程/API、库和缩略词

来自维基教科书,开放世界的开放书籍

围绕 OpenGL 有许多技术和缩略词。以下是它们的组织方式以及做出选择的具体位置。

(此处介绍的技术可能依赖于任何更低级的技术,而不仅仅是左侧的技术。)

低级 -> 高级
显卡 OpenGL  WGL (适用于 Windows) EGL GLEW  GLUT  SFML Graphics、ClanLib... (2D)
OpenGL ES GLX (适用于 X11) EAGL (iOS) Glee GLFW  Irrlicht、OGRE、Unity (3D)
WebGL CGL/AGL (适用于 OS X)  SDL、SFML OpenSG、OpenScenegraph...
您在此处的主要选择 :)
  • 基础技术是 OpenGL。OpenGL ES 是 OpenGL 的一个受限子集,针对嵌入式平台(智能手机等)。特别是 OpenGL ES 2.0 基于 OpenGL 2.0,但完全不包含已弃用的 OpenGL 1.x 功能。GLSL (着色语言) 是一种用于 OpenGL >=2.0 的编程语言,并在 GPU 上执行。WebGL 基于 OpenGL ES 2.0,并通过 JavaScript 在 2011 年的网络浏览器中提供。
  • 在它之上,您有一个系统相关的 OpenGL 实现 (WGL、GLX 等)。它提供标准的 glXxx 函数以及将 OpenGL 集成到操作系统显示中的方法。
  • EGL 应该为嵌入式系统的 OpenGL ES 实现提供一个单一接口,例如 Android 的接口。EGL 仍然需要特定于平台的代码,并且只处理低级的图形上下文和纹理设置。Apple 的 iPhone 使用一个修改/扩展版本,称为 EAGL。您可以在此级别工作,但通常您的程序的某些部分将特定于一个平台,而不是可移植的。
  • GLEW 和 GLee 在调用 C 中的 OpenGL 基础函数和扩展方面提供了一些帮助;您可以选择其中一个,因为它们几乎不会对您的代码进行更改,或者甚至都不选择,并使用 #define GL_GLEXT_PROTOTYPES 用于基本用途。
  • GLUT 以及 GLFW、SDL 和 SFML 提供了一个真正平台无关的包装器来启动 OpenGL 屏幕(完全相同的 C 代码)。通常它们还附带键盘、操纵杆以及可能的其他功能的支持。当您进行可移植的、直接的 OpenGL 编程或针对特定版本的 OpenGL 时,可以选择此级别的技术。这些技术往往依赖于完整的 OpenGL,但对 OpenGL ES 和 EGL 的支持正在到来。本书使用此层!
  • 库可以基于 OpenGL 来提供更高级的功能,例如游戏 2D 精灵管理(SFML Graphics、ClanLib...),或完整的 3D 引擎(Irrlicht、Ogre...)。它们可能完全屏蔽用户与 OpenGL 的交互,或者只隐藏细节(例如,只提供对 GLSL 的访问)。我们可以区分渲染引擎、场景图和更抽象的游戏引擎。您的选择将取决于您正在处理的应用程序类型(2D、3D、场景、游戏...)。

其他技术

  • DirectX/Direct3D 来自微软,是 OpenGL 的主要竞争对手。它涵盖了我们上面看到的几乎所有层,直到(包括)GLUT/GLFW 层。与 OpenGL 不同,它只在 Windows 平台上运行,是一种专有技术。
  • OpenCL 用于在显卡 GPU 上执行通用(非图形)代码,用于并行编程。CUDA 是一种专有的、特定于 Nvidia 的替代方案。
  • Mesa3D 为多种技术提供实现,例如 EGL、OpenGL、OpenGL ES,以及 OpenGL 的软件实现,可在没有 3D 卡的情况下工作,因此它跨越了几个基础层。它还允许从 GNU/Linux(X11)桌面使用 OpenGL ES。

GLEW 和 GLee 之间的比较(截至 2015 年 8 月)

  • GLee 支持 3.0,而 GLEW 支持 4.5
  • GLee 不需要任何初始化,而 GLEW 需要(glewInit()
  • GLee 没有发布与 mingw 兼容的二进制版本(只有与 VC++ 兼容的版本),GLEW 也没有
  • GLee 不会交叉编译(AFAICS),而 GLEW 会(参见 Windows 设置
  • GLee 似乎没有维护

硬件支持

[编辑 | 编辑源代码]

移动设备/智能手机

  • 大多数智能手机都支持 OpenGL ES 1.1。只有少数早期(2009 年)或低端型号,如 HTC G1/Dream/Hero/Magic(Qualcomm MSM72XX GPU)不支持 3D 加速。它在所有 iPhone 和 iPod Touch(PowerVR MBX GPU 和 SGX GPU)中受支持。
  • 大多数在 2010 年中旬之后发布的智能手机都支持 OpenGL ES 2.x,但低端型号除外。这包括 iPhone 3GS、iPod Touch 第三代(PowerVR SGX535 GPU)、三星 Galaxy S(PowerVR SGX540 GPU)、HTC Legend、三星 Galaxy Ace(Qualcomm MSM7227 GPU)、Nexus One(Qualcomm Snapdragon 芯片组/Adreno >= 200 GPU)...
  • 屏幕尺寸(以像素为单位)可能差异很大,从 240x320 到 640x960 不等。
  • Android 有关于 OpenGL 2.0 部署的 统计数据

台式机

  • 从 2002 年/2003 年开始提供 OpenGL 2.x。当前显卡支持 OpenGL 3.x 或 4.x。
  • 截至 2013 年 6 月,用于 GNU/Linux 的自由(自由软件)驱动程序支持 OpenGL 3.1(参见 Xorg wiki 的 RadeonFeature)。
    • Radeon r600 支持使用 mesa-dri >= 9.0 的 GLSL 1.3,支持使用 Linux 内核 >= 3.6 的 OpenGL 3.0(经过测试),并且显然支持使用 mesa-dri >= 9.1 和 xorg-xserver >= 1.13 的 OpenGL 3.1(待测试)
$ glxinfo | grep -i opengl
OpenGL version string: 3.0 Mesa 9.1.3
OpenGL shading language version string: 1.30

< OpenGL 编程

浏览并下载 完整的代码
华夏公益教科书