This post is quite a technical one, but we couldn’t help ourselves.
We have reviewed and improved the Random Number Generation system in Maverick, which benefits from our in-house developed generation scheme that we’ve relied on successfully since long, long ago. For this build, we have done some deep improvements in the algorithm that translate to a more eye-pleasing noise pattern on render time, and more importantly, less noise in the same render time, compared to previous builds.
How is this possible? #1
Without getting too pedantic, our RNG system has always done stratification for every single component along every light path. In simpler terms, this means that our numbers are not recklessly random, but carefully distributed to cover all possible path variations as richly and as early as possible.
We have been doing some well-designed experimental work to restructure our stratification scheme so the most visually prevalent features have a higher priority. The idea is for the experiments to yield a reordering of components that, indeed, has resulted in better efficiency. This is so despite our trusty RNG stays fundamentally the same; but is used better now.
This improvement affects noise overall, no matter what features are involved.
How is this possible? #2
There are some areas in the engine where full stratification is hard to achieve. In particular, we do light-splitting at each path bounce, since we allow for a user-set # of samples for each light source. We have implemented some extensions in our stratification system that have helped (greatly) in this regard.
This results in better noise sampling in particular. And this is particularly noticeable in direct illumination and in soft shadows.
How is this possible? #3
Last, but not least, we have given a final spin to our RNG system, which aims at giving blue noise statistical properties to the appearance of our noise distribution. Blue noise has nothing to do with color blue; it is a fancy name for noise that avoids low-frequency clustering. This type of noise has the wonderful property of being very eye-pleasing, so the same amount of noise, statistically-speaking, is perceived by the eye as “less noisy”.
We have achieved this by precomputing the order in which our RNG system issues fresh random numbers, and this results in the same good stratification properties explained before, but with a more eye-pleasing look on screen-space. This property is preserved at high Sampling Levels, although it is most noticeable at low spp, as depicted in the image below where SL=1:
As usual with deeply technical improvements, the gains that you may expect will vary from one scene to another. Factors such as the prevalence of deep GI in your scene, or the use of heterogeneous lights/IBL will weigh the new scheme up or down. But in the long run (high SL) every single scene will clear noise faster or significantly faster (2x even!). Also, there are no downsides to these improvements (i.e., cases where noise would clear more slowly).
Thanks for reading!