I had never been satisfied with the flat look of Reset’s ambient lighting. We have baked large-scale sky occlusion, but it doesn’t have nearly enough resolution to account for the geometric detail in places like forests. We’ve had screen-space ambient occlusion (SSAO) for many years, but something about it just wasn’t right. So I decided to see if I could improve it!
The top image is without any kind of screen-space ambient occlusion. It’s just for reference. You can bash SSAO variants for their problems all you want, but games that strive for photorealism shouldn’t look like the top image these days. There are other methods, but they tend to be much more intrusive.
The middle image has a custom implementation of Horizon-Based Ambient Occlusion (HBAO). That’s what we’ve been using for most of the project. Nowadays NVIDIA has an implementation of their own in their ShadowWorks package. Theirs could probably provide similar quality at better performance. According to their numbers they could also provide higher quality with slower performance. So far I’ve decided to keep roaming the great expanses of different SSAO approaches on my own. Sorry NVIDIA.
The bottom image has a custom implementation based on Deferred Screen-Space Directional Occlusion (DSSDO). Like all SSAO approaches, I can’t believe how dirty of a hack it is, but it seems to work. Notice the stronger contrast on the ground under the fallen branches, the bush in general, as well as around tree trunks. Performance is currently about the same as with our HBAO implementation. Unfortunately even though the algorithm operates with spherical harmonics, it doesn’t produce a visibility SH that you could multiply with your lighting SH. We just evaluate the occlusion SH using the pixel normal and use the resulting scalar occlusion value.