关于Using OpenGL extensions的这个问题,这些扩展函数的目的是什么?我为什么要使用它们?此外,是否有任何与使用它们相关的权衡或陷阱?
3 回答
OpenGL 标准允许各个供应商在创建新技术时通过扩展提供附加功能。扩展可能会引入新函数和新常量,并且可能会放宽或移除对现有 OpenGL 函数的限制。
每个供应商都有一个字母缩写,用于命名他们的新函数和常量。例如,NVIDIA 的缩写 (NV) 用于定义其专有函数 glCombinerParameterfvNV() 及其常量 GL_NORMAL_MAP_NV。
可能会发生不止一个供应商同意实现相同的扩展功能。在这种情况下,使用缩写 EXT。架构审查委员会可能会进一步“祝福”扩展。然后它被称为标准扩展,并使用缩写 ARB。第一个 ARB 扩展是 GL_ARB_multitexture,在 1.2.1 版本中引入。遵循官方扩展推广路径,多纹理不再是可选实现的 ARB 扩展,而是从 1.3 版本开始成为 OpenGL 核心 API 的一部分。
在使用扩展之前,程序必须首先确定其可用性,然后获取指向扩展定义的任何新功能的指针。执行此操作的机制是特定于平台的,并且存在诸如 GLEW 和 GLEE 之类的库以简化该过程。
OpenGL 扩展是添加到OpenGL 规范中的新功能,它们由 OpenGL 标准机构和各种显卡供应商添加。这些作为新的函数调用或变量暴露给程序员。OpenGL 规范的每个新版本都带有更新的功能,并且(通常)包括所有以前的功能和扩展。
OpenGL 扩展的真正问题只存在于 Windows 上。Microsoft 不支持在OpenGL v1.1之后发布的任何扩展。显卡供应商通过头文件和库提供他们自己的此功能版本来克服这个问题。但是,使用它可能会有点痛苦,因为您链接到的问题显示。但是随着GLEW的流行,这个问题已经基本消失,它负责将所有这些都包装到一个易于使用的包中。
如果您确实使用了最新的 OpenGL 扩展,请注意旧图形硬件可能不支持它。除此之外,使用这些扩展没有其他缺点。大多数成为标准的扩展都非常有用,并且几乎没有不使用它们的逻辑。
一般来说,扩展是显卡供应商向 OpenGL 添加新功能的一种方式,而不必等到 OpenGL 规范的下一个修订版。有不同类型的扩展:
- 供应商扩展 - 只有一个供应商提供某种类型的功能。
- 例子:
NV_vertex_program
- 例子:
- 多供应商扩展 - 多个供应商聚集在一起并就功能达成一致。
- 例子:
EXT_vertex_program
- 例子:
- ARB 扩展 - OpenGL 架构审查委员会已经祝福了这个扩展。你有一个合理的期望,这种类型的扩展会存在一段时间。
- 例子:
ARB_vertex_program
- 例子:
扩展不必经过所有这些步骤。有时,在硬件设计采用不同方式并放弃扩展之前,扩展仅由一个供应商实施。其他时候,在每个人都决定有更好的方法之前,扩展可能会达到 ARB 状态。(ARB_vertex_program
例如,当需要将着色器滚动到核心 OpenGL 规范中时,该方法被搁置,以支持高级着色语言方法ARB_vertex_shader
。)即使是 ARB 扩展也不会永远持续下去。例如,我今天不会写需要 的东西ARB_matrix_palette
。
综上所述,保持最新的扩展是一个非常好的主意,尤其是最新的 ARB 和 EXT 扩展。过去,通过硬件的某些“快速路径”确实只能通过扩展访问。同样,如果您想知道一块硬件可以做什么,没有比供应商特定的扩展更好的地方了。
如果您刚刚开始使用 OpenGL,我建议您调查一下:
ARB_vertex_buffer_object
(顶点)ARB_vertex_shader
/// GLSL规范(着色器ARB_fragment_shader
)ARB_shader_objects
更先进:
ARB/EXT_framebuffer_object
(离屏渲染)
这是已被纳入核心的所有功能,但最好单独查看它,这样您就可以更好地了解它的边界在哪里。(核心 OpenGL 规范无缝地混合了旧的和新的,所以如果你想保持在快速路径上,这可能非常重要,避免遗留,有时在软件路径中实现。)
无论您做什么,请确保对您决定使用的扩展进行适当的检查,并在必要时进行回退。即使您的卡可能具有给定的扩展名,也不能保证该扩展名会出现在其他供应商的卡上,甚至无法保证出现在具有相同卡的另一个操作系统上。