I have implemented a method of doing motion blur that is fast and effective in both 2D and 3D. The implementation on my own 2D graphics engine results in the following comparison:

There is only one parameter, and that is the blur amount. Its a simple float value that should probably be set around 0.5f, possibly lower considering how fast those fighters can zip by your cockpit. The code that was used to implement this is as follows:
UINT iPassCount;
if(!effect)
return;
//Set variables
effect->SetTechnique("comboblur");
if(FAILED(effect->SetFloat(effect->GetParameterByName(NULL, "fblur"), 0.7f))) return;
//Run the shader
effect->Begin(&iPassCount,0);
_pengine->getDriver()->getDevice()->SetRenderTarget(0, prev);
_pengine->getDriver()->getDevice()->SetTexture(0, HDRtex);
_pengine->getDriver()->getDevice()->SetTexture(1, tex1);
effect->BeginPass(0); //screen pass
_pengine->getDriver()->DrawFullScreenQuad(0.0f,0.0f,1.0f,1.0f);
effect->EndPass();
effect->End();
//copy the result to the target
_pengine->getDriver()->getDevice()->SetTexture(0, tex1);
_pengine->getDriver()->getDevice()->SetRenderTarget(0, target);
_pengine->getDriver()->DrawFullScreenQuad(0.0f,0.0f,1.0f,1.0f);
_pengine->getDriver()->getDevice()->SetTexture(0, NULL); //reset textures
_pengine->getDriver()->getDevice()->SetTexture(1, NULL);
The effect file that is referenced contains a single pixel shader that is shown below:
// Global variables
float fblur;
// Samplers
sampler s0 : register(s0);
sampler s1 : register(s1);
// Combo pass
float4 ps_main( float2 TexCoord : TEXCOORD0 ) : COLOR0
{
return lerp(tex2D(s0,TexCoord), tex2D(s1,TexCoord), fblur);
}
// Technique Section
technique comboblur
{
pass combination
{
PixelShader = compile ps_2_0 ps_main();
}
}
This is all done in directX, but its implementation is very simple. The contents of the rendered scene are stuck on a texture, which can be done either by grabbing the backbuffer or by setting the rendertarget prior to rendering, then that target is fed to a simple interpolation shader that, as you can see, only has one line of code in it. The interpolation shader takes the previous frame and blends it into the current one. The result of this is stored in the previous frame texture, and then the previous frame texture is copied into the backbuffer or whatever is being used for postprocessing.
The first hurdle in converting this to OGL and implementing it in FSO is the postprocessing. The best method would be to create a texture, set it as the rendertarget, go through all the normal rendering routines, then pass that texture and its surface to the motion blur shader, which would then have its own texture and corresponding surface for the previous frame. A GLSL version of the shader would then be called after setting the two textures (plus setting the rendertarget to the previous frame surface), and then the information on the previous frame texture would need to get copied into the original rendertarget that was used to gather the scene render. The one method that would be a sticking point is the full screen quad - a method would need to be created for that. Once the data is copied back into the rendertarget, its a simple matter of rendering the GUI to that rendertarget, then resetting the rendertarget back to the backbuffer and stuffing all the data back into it.
I think most of the stuff here has a direct equivelent in OpenGL, but I'm not sure. Taylor and anyone else whose working on the shader implementation, what do you think?