I thought I had formed a general understanding of how OpenGL naming conventions and extensions worked, until I stumbled upon a case that confused me.
Here's my understanding so far:
No suffix -- e.g.
glGenBuffers(). This function is a part of the core profile. The wiki page tells me that this was added to the core profile starting from version 1.5.
ARB -- e.g.
glGenBuffersARB(). This function is part of the standardized
GL_ARB_vertex_buffer_object extension. The spec of this extension clearly declares
GenBuffersARB() in the "New Procedures and Functions" section. The "Dependencies" section tells me that I can potentially access this from a 1.4+ context, if the hardware supports the extension.
EXT -- These are vendor-specific extensions and functions that only some vendors may support. Vertex buffer object doesn't seem to have an EXT extension in the registry.
Here's where my understanding breaks down:
glGenFramebuffers, as the wiki shows, was added to the core in 3.0.
Now I want to access the frame buffer features at a lower core profile version than 3.0. So I want to use it as an extension. The spec registry tells me that there are two available extensions - ARB and EXT.
Question 1 -- If an ARB extension exists, why does an EXT extension exist? Wouldn't you always choose the standardized one over the vendor-specific one?
A look at the ARB spec in the "New procedures and functions" section tells me that the extension defines the
GenRenderbuffers() function. No ARB suffix this time. GLEW doesn't have a function prototype for
glGenRenderbuffersARB() at all. Weird.
The EXT spec does however have a
GenRenderbuffersEXT() function in the new functions section, and GLEW also has
Question 2 -- Why no ARB suffix if there's an EXT suffix? How does this work for ARB, given that the names of the ARB function and the core function are the same?
Question 3 -- I ultimately want Framebuffer features from a 1.4 profile. Which extension and which function-set should I use so that I get maximum hardware compatibility coverage?