要向后兼容,你应该使用ARB扩展而不是核心呼叫吗?

时间:2014-05-23 00:54:04

标签: opengl graphics glsl shader

例如,我引用维基:

  

请注意,glDrawTransformFeedback完全能够从变换反馈对象进行渲染,而无需查询顶点数。虽然这只是GL 4.0的核心,但它在3.x级硬件上广泛使用

我认为这意味着它有一个扩展名。使用openGL库时,我是想进行正常的核心4.0调用,还是想进行ARB扩展调用?

我认为扩展可以针对较旧的硬件+较新的硬件,4.0调用只针对较新的硬件。或者我可以安全地使用4.0调用,然后不知何故旧硬件的前向兼容性足以使用扩展程序模拟该调用吗?

1 个答案:

答案 0 :(得分:4)

提升为核心 的扩展程序,除其他外,与其等效的核心功能相同的枚举。

例如,如果您查看GL_EXT_transform_feedback引入的常量,它们与 OpenGL 3.0 中没有_EXT后缀的常量非常相似(此扩展名)在3.0)中被提升为核心。

GL_RASTERIZER_DISCARD_EXT       = 0x8C89  (GL_EXT_transform_feedback)
GL_RASTERIZER_DISCARD           = 0x8C89  (Core OpenGL 3.0)

ARB扩展是升级为核心的唯一扩展源。有EXT,NV,APPLE,ATI(AMD)和SGI扩展,现在也是核心OpenGL API的一部分。


基本上,如果你有一个扩展已被提升为核心的版本,你应该向驱动程序询问proc。函数的地址由 核心 名称而不是它所源自的扩展名。

原因很容易证明:

我有来自NV的 OpenGL 4.4 实现 实现GL_APPLE_vertex_array_object,即使该扩展已提升为核心 OpenGL 3.0 。相反,此NV驱动程序实现衍生GL_ARB_vertex_array_object扩展。

如果您的软件编写为期望GL_APPLE_vertex_array_object,因为这是一个正式升级为核心的扩展,您可能会对我的GPU /驱动程序有一个完全错误的想法。

但是,如果您查看了上下文版本并看到 4.4 ,您就会知道glGenVertexArrays (...)保证可用,并且您不必加载APPLE函数这个驱动程序一无所知:glGenVertexArraysAPPLE (...)


最后,关于你引用的陈述:

  

请注意,glDrawTransformFeedback完全能够从变换反馈对象进行渲染,而无需查询顶点数。虽然这只是GL 4.0的核心,但它在3.x级硬件上广泛使用。

这与GL_ARB_transform_feedback2有关。该扩展不需要GL4类硬件,但当ARB完成整个3.3 / 4.0拆分时,不包括在3.3中的核心。如果你有核心 OpenGL 4.0 ,或者你的驱动程序列出了这个扩展名(作为3.3实现可能,但不需要),那么这种行为保证适用。

  

OpenGL 4.0 Core Profile Specification - J.1新功能 - 第424页

     
    

其他转换反馈功能包括:

         
      
          
  • 转换封装变换反馈相关状态的反馈对象;
  •       
  • 暂停和恢复变换反馈操作的能力;和
  •       
  • 能够在不查询捕获的原始数量的情况下绘制在变换反馈模式下捕获的基元       (GL_ARB_transform_feedback2)。
  •