I'm assuming that you are not doing parallel rendering and that all you viewports are the same size and all use the same colour bit depth for render targets.
Under this assumption and in this case u could iterate through each of the 4 cams and render each scene in turn. Then after the last cam is rendered display the result to screen. This way u only need 1 FBO, 1 quad.
// pseudo
renderer.setrendertarget(fbo)
renderer.setvshader(...)
renderer.setpshader(...)
renderer.bindallsortofdata(...)
for (cam: cams)
{
// a viewport defines an area that will be drawed on, anything outside of viewport area will not be rendered, so each cam show define its own viewport
cam.setviewport(renderer)
// not a must, but you can also lookup scissors( ) as they define the drawing area that will be cut away, if a scissor is not defined that it matches the viewport size
cam.setscissor(renderer)
cam.renderscene(renderer, and pass the appropriate scene)
}
renderer.unbindallsortofdata()
renderer.unsetvshader()
renderer.unsetpshader()
renderer.unsetrendertarget(fbo)
renderer.renderquadwithtexturefromfbo()
renderer.show( )
Something like this should do the trick.
If you're doing parallel rendering, then use 4 fbos, etc…
That's it. All the best ?