什么是OpenGL扩展,使用它们有什么好处/缺点?

时间:2020-03-05 18:40:58  来源:igfitidea点击:

关于使用OpenGL扩展的问题,这些扩展功能的目的是什么?我为什么要使用它们?此外,是否存在与使用它们相关的权衡或者陷阱?

解决方案

回答

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的普及,这个问题已基本消失,GLEW负责将所有这些包装到易于使用的包装中。

如果确实使用了最新的OpenGL扩展,请注意,较旧的图形硬件可能不支持该扩展。除此之外,使用这些扩展没有其他缺点。成为标准的大多数扩展都非常有用,没有使用逻辑几乎没有逻辑。

回答

通常,扩展是图形卡供应商向OpenGL添加新功能的一种方式,而不必等到OpenGL规范的下一个修订版。有不同类型的扩展名:

扩展不必完成所有这些步骤。有时,扩展只由一个供应商实施,然后硬件设计采用另一种方式并放弃了该扩展。有时,扩展可能会在每个人都认为有更好的方法之前将其扩展到ARB状态。 (例如,当需要将着色器滚动到核心OpenGL规范中时,ARB_vertex_program方法被搁置,而支持ARB_vertex_shader的高级着色语言方法。)即使是ARB扩展也不会永远存在。例如,今天我不会写一些需要ARB_matrix_palette的东西。

综上所述,最好保持最新的扩展,尤其是最新的ARB和EXT扩展。过去确实确实只有通过扩展才能访问某些通过硬件的"快速路径"。同样,如果我们想知道某个硬件可以实现的所有功能,那么没有比供应商特定扩展更好的地方了。

如果我们刚刚开始使用OpenGL,建议我们进行以下调查:

  • ARB_vertex_buffer_object(顶点)
  • ARB_vertex_shader/ARB_fragment_shader/ARB_shader_objects/ GLSL规范(着色器)

更先进:

  • ARB / EXT_framebuffer_object(屏幕外渲染)

这是已集成到核心中的所有功能,但是最好单独查看它,以便我们可以更好地了解其边界所在。 (核心OpenGL规范无缝地将新旧混合在一起,因此,如果我们想保持快速发展的道路,避免使用旧的并且有时在软件路径中实现,这可能非常重要。)

无论我们做什么,都要确保对要使用的扩展名进行了适当的检查,并在必要时进行备用。即使卡可能具有给定的扩展名,也无法保证该扩展名将出现在另一家供应商的卡上,甚至存在于具有同一卡的另一操作系统上。