You already got it. Just some details needed. I think all bitmaps have to be the same size! If you have two textures, fSource1 and fSource 2, then create the destination texture, fSource3. After that, you can do as follows. I didn't allocate a depth buffer below, and maybe you need to explicitly disable the depth buffer also (I don't remember). You will get the "framebuffer incomplete" if something is wrong.[source lang="cpp"]// Create the frame buffer object//-------------------------------glGenFramebuffers(1, &fboName);// enable this frame buffer as the current frame bufferglBindFramebuffer(GL_FRAMEBUFFER, fboName);// attach the textures to the frame bufferglFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fSource1, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, fSource2, 0);glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, fSource3, 0);GLenum fboStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);if (fboStatus != GL_FRAMEBUFFER_COMPLETE) { printf("FrameBuffer incomplete: 0x%x\n", fboStatus); exit(1);}glReadBuffer(GL_COLOR_ATTACHMENT0); // Prepare reading from this textureGLenum bufferlist[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };glDrawBuffers(1, &bufferlist[2]); // Prepare drawing into buffer 2.glBlitFramebuffer(..); // This will now copy from GL_COLOR_ATTACHMENT0 to GL_COLOR_ATTACHMENT2glReadBuffer(GL_COLOR_ATTACHMENT1); // Read from this texture instead nowglBlitFramebuffer(..); // This will now copy from GL_COLOR_ATTACHMENT1 to GL_COLOR_ATTACHMENT2glBindFramebuffer(GL_FRAMEBUFFER, 0); // Disable FBO when done[/source]

As Bregma says, but notice that this is not a short-coming of your graphics drivers. They already have the functionality (if they are recent), but the extension wrangler will unlock the access to this. There are ways to do it manually, but it is a waste of effort.

All OpenGL calls are going through the opengl32.dll supported by Microsoft, and they see no reason to improve on this as there is Direct3D instead.

When using an extension wrangler like glew, you no longer need to include GL/gl.h. Instead you include GL/glew.h. But don't forget to first initialize the library as soon as you have a context available (an open window).

You should also consider the difference between legacy OpenGL and OpenGL 3+. The GL/glu.h has several legacy things, and is maybe less used these days.

The big difference is the legacy immediate mode. That is, you do glBegin(), then define vertices, possibly some attributes, and then glEnd(). This is simple, which makes many beginners like it.

The new way to do this is more complicated, but much more flexible. So it takes some to learn it, but when you got it running you usually do not want to go back again. The idea is instead to allocate a local buffer in RAM, store vertex data into it, transfer the buffer to the GPU, define a vertex shader and a fragment shader, and finally run the shaders with this GPU buffer as input. The vertex data you store in the buffer can be any type of data. It is up to you what you want to do with it in the shaders.

Wow, I really appreciate all the information. One of the most difficult issues when trying to learn the 'updated' way of doing this, is the sheer volume of older tutorials and code out there on the net. So I am very thankful for the links, and also the terminology (which is a huge help in knowing 'what' to search for).