我以为我对OpenGL命名约定和扩展的工作方式已经形成了大致的了解,直到偶然发现一个令我困惑的案例。


到目前为止,我的理解是:

没有后缀-例如glGenBuffers()。此功能是核心配置文件的一部分。 Wiki页面告诉我这是从1.5版开始添加到核心配置文件中的。

ARB-例如glGenBuffersARB()。此功能是标准GL_ARB_vertex_buffer_object扩展的一部分。此扩展的规范在“新过程和函数”部分中明确声明了GenBuffersARB()。 “依赖项”部分告诉我,如果硬件支持扩展,则我可以从1.4+上下文访问它。​​



我的理解在这里中断了:

glGenFramebuffers,如Wiki所示,是在3.0中添加到内核中的。

现在我想以比3.0更低的内核配置文件版本访问帧缓冲区功能。因此,我想将其用作扩展。规范注册表告诉我,有两个可用的扩展名-ARB和EXT。

问题1-如果存在ARB扩展名,为什么存在EXT扩展名?您难道不是总是选择标准化的标准,而不是供应商特定的标准吗?这次没有ARB后缀。 GLEW根本没有GenRenderbuffers()的功能原型。

EXT规范在新功能部分确实具有glGenRenderbuffersARB()功能,而GLEW也具有GenRenderbuffersEXT()

问题2-为什么在ARB没有后缀的情况EXT后缀?假设ARB函数的名称和核心函数的名称相同,这对ARB如何起作用?

问题3-我最终希望使用1.4配置文件中的Framebuffer功能。我应该使用哪个扩展名和哪个功能集,以便获得最大的硬件兼容性覆盖?

#1 楼

问题1-通常EXT版本首先是两个或多个供应商之间的协作。 ARB扩展需要Khronos的投票成员之间进行更多讨论,并且可以在获得批准之前对EXT版本进行更改。请参阅GL_ARB_direct_state_access扩展,与GL_EXT_direct_state_access相比,有很多更改。

问题2-
GL_ARB_framebuffer_object扩展的“问题”部分说明了为什么函数没有ARB后缀的原因:


(8)为什么此扩展中的新令牌和入口点没有像其他ARB扩展那样的后缀?

   RESOLVED: Unlike most ARB extensions, this is a strict subset of
   functionality already approved in OpenGL 3.0. This extension
   exists only to support that functionality on older hardware that
   cannot implement a full OpenGL 3.0 driver. Since there are no
   possible behavior changes between the ARB extension and core
   features, source code compatibility is improved by not using
   suffixes on the extension.



问题3-
如果要在GL版本小于3.0的上下文中使用帧缓冲对象,则需要查看扩展字符串:


如果GL_ARB_framebuffer_object受支持,请使用非ARB函数。
如果仅支持GL_EXT_framebuffer_object,请使用EXT函数。
如果两个扩展都不被支持,则需要像pbuffers一样退回到OS级别的屏幕外渲染。 >