我以为我对OpenGL命名约定和扩展的工作方式已经形成了大致的了解,直到偶然发现一个令我困惑的案例。
到目前为止,这是我的理解:
没有后缀 -例如glGenBuffers()
。此功能是核心配置文件的一部分。该wiki页面告诉我,这是添加到从1.5版本开始核心简档。
ARB-例如glGenBuffersARB()
。此功能是标准化GL_ARB_vertex_buffer_object
扩展的一部分。此扩展的规范GenBuffersARB()
在“新过程和函数”部分中明确声明。“依赖关系”部分告诉我,如果硬件支持扩展,则可以从1.4+上下文访问此文件。
EXT-这些是特定于供应商的扩展和功能,只有某些供应商可以支持。顶点缓冲区对象在注册表中似乎没有EXT扩展名。
这是我的理解破裂的地方:
glGenFramebuffers
正如Wiki所示,在3.0中已添加到核心。
现在,我想以低于3.0的核心配置文件版本访问帧缓冲区功能。因此,我想将其用作扩展。规范注册表告诉我,有两个可用的扩展名-ARB和EXT。
问题1-如果存在ARB扩展名,为什么存在EXT扩展名?您是否总会选择标准化的而不是特定于供应商的一种?
查看“新过程和函数”部分中的ARB规范可知,该扩展定义了该GenRenderbuffers()
函数。这次没有ARB后缀。GLEW根本没有功能原型glGenRenderbuffersARB()
。奇怪的。
EXT规范GenRenderbuffersEXT()
在新功能部分中确实具有功能,而GLEW也具有glGenRenderbuffersEXT()
。
问题2-如果有EXT后缀,为什么没有ARB后缀?假设ARB函数的名称和核心函数的名称相同,这对ARB如何起作用?
问题3-我最终希望使用1.4配置文件中的Framebuffer功能。我应该使用哪个扩展名和哪个功能集,以便获得最大的硬件兼容性覆盖?