关于这个问题 使用 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. 。显卡供应商通过头文件和库提供他们自己的此功能版本来克服这个问题。然而,正如您链接到的问题所示,使用它可能会有点痛苦。但随着 格鲁夫, ,它负责将所有这些包装到一个易于使用的包中。

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

一般来说,扩展是显卡供应商向 OpenGL 添加新功能的一种方式,而无需等到 OpenGL 规范的下一个修订版。有不同类型的扩展:

  1. 供应商扩展 - 只有一个供应商提供某种类型的功能。
    • 例子: NV_vertex_program
  2. 多供应商扩展 - 多个供应商聚集在一起并就功能达成一致。
    • 例子: EXT_vertex_program
  3. ARB 扩展 - OpenGL 架构审查委员会已经批准了该扩展。您有合理的预期,这种类型的扩展将会存在一段时间。
    • 例子: ARB_vertex_program

扩展程序不必执行所有这些步骤。有时,在硬件设计采用不同的方式并放弃扩展之前,扩展仅由一个供应商实现。其他时候,在每个人都决定有更好的方法之前,延期可能会达到 ARB 状态。(这 ARB_vertex_program 例如,该方法被搁置以支持高级着色语言方法 ARB_vertex_shader 当需要将着色器纳入核心 OpenGL 规范时。)即使 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 规范将新旧规范无缝地混合在一起,因此,如果您想保持快速路径并避免遗留问题,有时需要在软件路径中实现,这一点非常重要。)

无论您做什么,请确保对您决定使用的扩展进行适当的检查,并在必要时进行回退。即使您的卡可能具有给定的扩展名,也不能保证该扩展名会出现在其他供应商的卡上,甚至出现在具有同一卡的另一个操作系统上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top