Unreal Engine leverages the power of Signed Distance Fields for Ambient Occlusion and more recently added Ray Traced Distance Field Soft Shadows. I will briefly discuss and demonstrate both effects as a result of some early research to consider using these techniques for our game. Since the core of Switch’s design hinges on fully dynamic levels, we simply cannot bake down any lighting. As a result we have to look out for a better approach to create scene definition and toning that is both fully dynamic and lightweight enough to run on a wide range of PCs.
Distance Field Ambient Occlusion
The Unreal 4.3 release introduced Distance Field Ambient Occlusion using a Signed Distance Field. The basic principle of a distance field is that it represents the distance from the object to the point in the the grid. ByteWrangler has a nice and simple explanation on distance field in 2d if you’d like to know more. To better understand how DFAO can be of use for Switch I did some setup & research using the Unreal examples and some of the meshes we currently have available for our project.
Unreal 4 Mobile Demo Scene
DFAO In Switch
A quick test on the meshes we use in Switch revealed mixed results, mostly due to open mesh hulls which the documentation pages do mention may cause issues. Our test wall which is completely triangle sealed did provide much better results.
Issues & Performance
At it stands the effect is quite a burden on the GPU (See documentation for performance measurements) and the impact was very noticable when first using this in a full level. I will keep an eye out for upcoming updates to Epic’s DFAO and revisit this in the future once we got our new art. Until then SSAO and baked self-occlusion maps are a good alternative for us.
Ray Traced Distance Field Soft Shadows
The preview release of 4.5 introduced Ray Traced Distance Field Soft Shadows to the Unreal Engine, while I am not aware of the full implementation details, I can show you the practical effect in-game using the Sun Temple & Effects Cave examples from Unreal.
The image below illustrates the basic goal of the soft shadowing technique, hard shadows near the caster that slowly soften as they get further away. This adds an incredible amount of shadow quality using a simple checkbox and can work wonders on your long normally low detailed directional shadows too when using high frequency details like rails.
One thing that stands out in the Sun Temple demo is the increased quality of the pillars on the right side, using soft shadows you get a much more accurate result.
In the final test I enabled soft shadows in the Landscape Demo and did not encounter a huge difference there. Primarily more accurate shadows on the rocks and bridges so I left it out.
Visualizing Distance Fields
The editor supports some cool visualizations, be sure to check the “Mesh DistanceFields” (shown below) when working with DFAO or soft shadows. The “DistanceField AO” visualizer only displays the generated AO as seen in the test wall comparison image above (under “DFAO in Switch”)
The official documentation lists several limitations and future improvements for DFAO. What struck me the most is the current GPU cost of the technique, 4.5ms vs. 0.6 ms of SSAO on a 7970 at 1080p. This is fairly high and I did notice an immediate drop in performance when doing some initial tests on Switch. With the effect being used in Epic’s very own Fortnite I hope they will continue to improve upon the technique and hopefully find some performance gains along the way.
The Ambient Occlusion technique does not work flawlessly for all situations and models, I recommend giving it a try when you have a good representation of your final geometric style and see if this technique is well-suited. The same seems true for Soft Shadows and I’ve found a few cases that yielded undesirable results. The angel figure in the Mobile demo is a good example where Soft Shadows did not yield the expected results. Skeletal Meshes do not work with soft shadows and as a result don’t display a shadow at all (You may notice that they will not show up in the Mesh DistanceField visualizer either)
Update: To resolve the shadowing issues above the distance field resolution map should be increased. More info on the official docs page.