Unreal 5.3 Camera Motion Blur

As of Unreal 5.3, support for exempting camera rotation from motion blur no longer requires a source build of Unreal.

Title Motion Blur Image

Per-object motion blur gives some very clean results, especially when subtle. Unreal's implementation is very solid with a few settings dialled in, namely the target frame rate of the motion blur on platforms with unlocked framerates and blur on camera rotation.

Frame Rate Matching

The former is a quick fix and can be set in one of many places. I'll leave the exact place up to the reader, but in general, earlier is preferrable so it's simpler to modify later.

My general go-to is to set this in Device Profiles with a default of zero. Platforms can override this setting on a per-platform basis using the same system. This system also provides a clean way to group settings for scalability.

Example image showing the location of the DeviceProfiles settings
Set Motion Blur TargetFPS under Rendering

Removing Rotational Blur

Removing the blur on camera rotation is slightly more involved, and requires a source build of Unreal versions prior to 5.3, or any build of Unreal at or beyond 5.3. This is because the variable that controls this setting was made accessible in 5.3, so we can easily get to it in a ViewportClient.

To begin, create a subclass of UGameViewportClient. If you wish to use CommonUI, the parent should be UCommonGameViewportClient instead. Since we only need to set a variable on the SceneViews, we only need to override FinalizeViews.

Example of Finalize Views declaration
Override FinalizeViews

The definition of this method is also pretty short. I will leave it as an exercise for the reader to be smarter about setting the MotionBlur state on all views. A check for Value being a nullptr in the example below may also be worthwhile.

Example showing disabling camera motion blur
Set CameraMotionBlur to False

Code

    Super::FinalizeViews(ViewFamily, PlayerViewMap);

    for (const auto &PlayerView : PlayerViewMap)
    {
        if (PlayerView.Value)
        {
            PlayerView.Value->bCameraMotionBlur = false;
        }
    }

Body of FinalizeViews

Setting the Viewport Client

The last step is to set the viewport client. You need to do this for CommonUI as well, if you use it. The setting is under General Settings in Project Settings, and it's easiest to find it by searching for 'viewport' in the search. In the example below, I've shown the setting for CommonGameViewportClient, but this should read your custom class name.

Example showing search
Game Viewport Location