Microsoft DirectX 9.0

Motion Blur Sample


The MotionBlur sample demonstrates a vertex shader that creates a motion blur effect by stretching some vertices along the direction of motion and fading their transparency.


Source: (SDK root)\Samples\C++\Direct3D\MotionBlur

Executable: (SDK root)\Samples\C++\Direct3D\Bin

User's Guide

The following table lists the keys that are implemented. You can use menu commands for the same controls.

UP ARROWIncrease the motion blur trail length.
DOWN ARROWDecrease the motion blur trail length.
ENTERStarts and stops the scene.
SPACEBARAdvances the scene by a small increment.
F1Shows Help or available commands.
F2Prompts the user to select a new rendering device or a new display mode.
ALT+ENTERToggles between full-screen and windowed modes.
ESCExits the application.

The mouse is also used in this sample to control the viewing position.

Programming Notes

The sample shows two spheres, both represented by the same ID3DXMesh object. The spheres move in an ellipse, and each sphere remembers the matrix for its current position and last-computed position. Each sphere is rendered once using the "normal" (ordinary) shader, and once using the motion-blur shader.

The motion-blur shader starts by transforming the vertex position (v0) through the last-frame world matrix (c0) and the current-frame world matrix (c4), and stores the results in r0 and r1. The normal vector (v1) is also transformed through the current-frame world matrix (c4) and the result is stored in r2.

r3 gets the motion delta vector from r0 to r1, and is normalized. Then r4.x gets set to the dot product of the vertex normal and the motion delta vector. So the closer the vertex normal is to the motion delta vector, the larger r4.x will be for that vertex. If r4.x is less than zero, the vertex normal points away from the motion delta vector. Only these vertices will be blurred.

In the next section, r4.y gets set to 1 if r4.x is less than zero (c20.y), or 0 if r4.x is zero or positive. So the motion blur will only be applied to vertices whose normal faces away from the direction of motion. If r4.y is zero, r1 is unchanged. If r4.y is 1, r1 will get -r3 (the motion direction) added to it.

Next r1 is transformed through the rotation and projection matrices, and the result goes into oPos.

Finally, the diffuse color is computed and stored in oD0, with oD0's alpha being set to 0 if r4.x (the dot product of the vertex normal and the direction of motion) is negative, or 1 otherwise. This makes the blur fade out as it gets further from the real object.

This sample uses the sample framework code that is shared with other samples in the Microsoft?DirectX® software development kit (SDK). You can find the sample framework headers and source code in (SDK root)\DXSDK\Samples\C++\Common\Include and (SDK root)\DXSDK\Samples\C++\Common\Src.

© 2002 Microsoft Corporation. All rights reserved.