|Warning: This article describes legacy OpenGL APIs that have been removed from core OpenGL 3.1 and above (they are only deprecated in OpenGL 3.0). It is recommended that you not use this functionality in your programs. Consider using Framebuffer Objects instead.|
Sometime in 2000, WGL_EXT_pbuffer was introduced and later on WGL_ARB_pbuffer and GLX_SGIX_pbuffer. This extension is for creating a pixel buffer (p-buffer), also called offscreen buffer. It didn't suffer the problem of pixel ownership test, so if you want to do a screen capture with glReadPixels, covered part of your window by other windows is not a problem for a p-buffer.
The need came along for render to texture since Direct3D was already capable of doing this.
WGL_ARB_render_texture was created to address this need. I'm not sure if a GLX version of this exists. http://www.opengl.org/registry doesn't show it.
WGL_ARB_pbuffer and WGL_ARB_render_texture are quite complicated to use. They require a separate context creation. You can still find examples on the web to this date.
Direct3D's render to texture didn't require a new context creation and was very simple to use.
Sometime in 2003, the community was asked for feedback in order to create a new extension. Sometime in 2004, GL_EXT_framebuffer_object was made available. This is also called FBO. This was a very complex spec yet the feature is so simple to use, it would take you 10 minutes to write a demo code.
All GPUs of that generation and beyond now support FBOs. These are SM 2.0 GPUs like the Radeon 9500 and Geforce FX 5200. FBO can be used for offscreen rendering and also render to texture (RTT).
For some people, they need to do some OpenGL rendering without creating a window. In this case, it is suggested that you do create a window, but make it invisible, setup the pixel format as usual. Create your FBO (render target) and fire away.
FBO became core in GL 3.0. FBO is also core in GL ES.