On The Bubble

On The Bubble was another custom engine project which I worked on throughout my 3rd university year. We created a cross-platform (Windows / PS5) project with a strong focus on pathtracing and custom physics. I focused on the PS5 graphics side as well as SVGF denoising. This was definitely the most difficult task I had so far in my programming experience.

While one teammate worked on wavefront pathtracing with physically based shading, I looked into various denoising methods. We decided on Spatiotemporal Variance-Guided Filtering. I read through Nvidia’s SVGF paper and looked at the implementation in Nvidia’s Falcor renderer, after which I started working on my own implementation targeted at our cross-platform pathtracing pipeline.

The implementation consisted of a few steps (mentioned in the SVGF paper). Below is a flowchart of our rendering pipeline, where I worked on all of the denoising stages:

The function RenderAPI::Render() was our entry point for rendering, and every box in the flowchart is a separate shader (or dispatch, as we only used compute shaders).

I started with temporal reprojection, which combined the data from the previous and current frame to lower the amount of variance.

Weight calculations informed the filter where to focus by calculating the amount of variance at each pixel.

I then drove an A-Trous wavelet filter which smoothed out the image, based on the weights calculated in the previous step.

Finally, I multiplied albedo with the A-Trous result and added emission back in (modulation), as I performed albedo demodulation before reprojection to help preserve texture details.

The HLSL shaders can be found on my GitHub.

The above SVGF implementation resulted in this:

Before After
Previous
Previous

Hellbound

Next
Next

Custom Shaders in Unreal Engine 5