Blue noise dithered Sobol
Posted: Sun Mar 15, 2020 2:07 pm
Hi,
I have been investigating this topic lately and wanted to discuss if we have some reasonable way to implement that.
1st idea:
I basically stole Cycles implementation (https://developer.blender.org/D2149)
The idea is basically to use a blue noise mask to offset the samples between pixels. Instead of using a white RNG to apply the Cranley-Patterson rotation, I am using a blue-noise mask (the same as Cycles).
This seems to work ok and it is not a huge cost (basically a fetch from a matrix instead of a random number generation)
Limitations:
[*] I had to disable the pass scrambling, which generates correlation artifacts for LIGHTCPU and PATHCPU. Maybe only applying the pass scrambling for the light path is a sensible solution, but the interface does get a bit weird.
[*] This only improves for low sample counts. It degrades to white noise as rendering goes on.
Comparison:
At 1spp:
At 4spp: 2nd idea
I tried implementing the method described in A Low-Discrepancy Sampler that Distributes Monte Carlo Errors as a Blue Noise in Screen Space (Eric Heitz et al.)
They have a sample code that I've hacked into Luxcore, but although the convergence might be a little bit better, I don't see an obvious blue noise appearance such as the one they display in the paper (https://belcour.github.io/blog/research ... noise.html)
I am probably doing something stupid.
Any suggestions are welcome.
I have been investigating this topic lately and wanted to discuss if we have some reasonable way to implement that.
1st idea:
I basically stole Cycles implementation (https://developer.blender.org/D2149)
The idea is basically to use a blue noise mask to offset the samples between pixels. Instead of using a white RNG to apply the Cranley-Patterson rotation, I am using a blue-noise mask (the same as Cycles).
This seems to work ok and it is not a huge cost (basically a fetch from a matrix instead of a random number generation)
Limitations:
[*] I had to disable the pass scrambling, which generates correlation artifacts for LIGHTCPU and PATHCPU. Maybe only applying the pass scrambling for the light path is a sensible solution, but the interface does get a bit weird.
[*] This only improves for low sample counts. It degrades to white noise as rendering goes on.
Comparison:
At 1spp:
At 4spp: 2nd idea
I tried implementing the method described in A Low-Discrepancy Sampler that Distributes Monte Carlo Errors as a Blue Noise in Screen Space (Eric Heitz et al.)
They have a sample code that I've hacked into Luxcore, but although the convergence might be a little bit better, I don't see an obvious blue noise appearance such as the one they display in the paper (https://belcour.github.io/blog/research ... noise.html)
I am probably doing something stupid.
Any suggestions are welcome.