Con motion blur si intende la sfocatura di alcune aree di un'immagine dovuta all'elevata velocità di queste zone e alla persistenza dell'immagine, per un determinato periodo di tempo, in un supporto, sia esso elettronico e naturale (l'occhio umano).
Per simulare questo effetto è necessario un render-target, delle stesse dimensioni del back-buffer, che faccia da accumulation buffer; il formato dipende dalla precisione e dalla fluidità di sfocatura richiesta durante l'animazione, i più utilizzati sono A8R8G8B8 e A16R16G16B16F. Il primo richiede una quantità modesta di memoria e per la sua bassa precisione è ottimale nella riproduzione di sfocature abbastanza marcate, mentre col secondo il controllo e la precisione sono ottime anche con sfocatura lieve, tuttavia il consumo di memoria e di banda è elevato soprattutto alle alte risoluzioni.
Per controllare l'effetto è necessaria una variabile di tipo float che specifica l'interpolazione tra i pixels del fotogramma corrente e quelli dell'accumulation buffer; questa variabile è controllata da codice C# e, per fare in modo che la durata della "scia" sia costante, deve fare riferimento sia al tempo trascorso dall'ultimo fotogramma che ad una costante che ne controlla l'intensità in questo modo:
float blur = MathHelper.Clamp((float)gameTime.ElapsedGameTime.TotalSeconds * 20.0f, 0.0f, 0.8f);
dove 20.0f è la costante che controlla l'intensità; il metodo Clamp è utilizzato in modo che il range di interpolazione sia sempre tra i valori 0.0 e 0.8.
Il Pixel Shader che realizza l'effetto è molto semplice:
1 // Sampler dell'immagine sorgente e dell'accumulation buffer
2 sampler2D sceneSampler;
3 sampler2D accumulationSampler;
4
5 // Intensità della sfocatura
6 uniform float blurStrength;
7
8 float4 ps_main(float2 TexCoords : TEXCOORD0) : COLOR0
9 {
10 // Recupero le informazioni dai render-targets per il pixel corrente
11 float4 color = tex2D(sceneSampler, TexCoords);
12 float4 accColor = tex2D(accumulationSampler, TexCoords);
13
14 // Interpolazione tra colore del frame corrente e del buffer per
15 // il motion-blur
16 return lerp(color, accColor, blurStrength);
17 }
Effetto del motion blur applicato ad una scena:

È da notare, qui più che in altri post-processi, la necessità di allineare correttamente il rettangolo di rendering perchè utilizzando un accumulation buffer e campionando scorrettamente i texels si avrebbe uno scivolamento dell'immagine.
L'ultima cosa da trattare è come inizializzare l'accumulation buffer; il nome già suggerisce la sua funzione (quella di accumulare il colore dei vari texels) tra i vari fotogrammi. Proprio per questo può essere inizializzato impostandolo al colore nero (se il tempo di blurring è basso il tutto si ridurrà ad un breve fade-in dell'immagine visibile al giocatore). Altrimenti è possibile inizializzarlo con una copia del primo fotogramma renderizzato utilizzando la funzione GraphicsDevice.ResolveBackBuffer(tex) ed usando l'argomento tex come texture per lo shader.