Commit Graph

348 Commits

Author SHA1 Message Date
98a9aeb374 Minor tweaks to Owen scrambling functions. 2022-07-25 15:43:07 -07:00
ef489c1ca2 Minor cleanup of the Owen scramble code. 2022-07-23 14:17:38 -07:00
f95e869848 Give Owen scramble functions their own hash.
This lets us move the seeding overhead outside the main loop,
which in turn lets us avoid taking it every round.
2022-07-23 13:24:24 -07:00
40d643b334 Put hilbert and morton code into one module. 2022-07-23 12:57:57 -07:00
0df18ce908 New hash seeding approach.
There didn't seem to be any issues in practice with the last
approach, but I thought of some other ways things could in theory
interact badly.  This fixes that.
2022-07-21 14:18:55 -07:00
570878d052 Eliminate branch in per-bit Owen scrambling functions. 2022-07-21 12:28:47 -07:00
f5a0210cdf More principled seeding approach in the hash functions. 2022-07-21 12:15:36 -07:00
7082f2d7f4 Update hash functions to known good ones instead of bespoke ones. 2022-07-21 05:22:22 -07:00
0d71ae86db Noticed that z-scrambling is actually just base-4 Owen scrambling.
Updated function name and comments to reflect that.
2022-07-21 04:44:05 -07:00
6b7538e25f Make the z-scrambling table smaller with bit fiddling.
This gets it down to 24 bytes.
2022-07-21 04:20:03 -07:00
ec9a121e72 Implement screen-space blue-noise sampling properly. 2022-07-21 03:59:47 -07:00
83b48f722d Simpler way to implement screen-space blue-noise sampling.
We now do the index scrambling at the top of the sampling loop,
which is also faster since we only have to run it once per pixel
instead of once per sample.
2022-07-20 18:54:38 -07:00
86814dbf8f Minor rearrangement of ray generation sampling code. 2022-07-17 21:18:46 -07:00
89429ed9f0 Fix silly bug in light transforms introduced during the switch to RMath. 2022-07-17 17:40:14 -07:00
d55ec9b025 Update psychopath code to work with RMath changes. 2022-07-17 17:24:58 -07:00
e2044e6579 Implement simple screen-space blue-noise diffusion sampling.
From the paper "Screen-Space Blue-Noise Diffusion of Monte Carlo
Sampling Error via Hierarchical Ordering of Pixels" by Ahmed et al.
2022-07-16 19:35:23 -07:00
ea4ba81110 Use faster routines where precision isn't needed. 2022-07-16 01:09:33 -07:00
08e2e6eb06 Convert Psychopath over to use new RMath library. 2022-07-15 21:42:35 -07:00
e0ee0d6dff Change to using a dedicated affine transform type.
This lets certain operations, especially matrix inversion, be
quite a bit faster.  And we don't need anything beyond affine
transformations anyway.
2021-05-14 13:30:28 -07:00
e6f9af9336 Update to latest glam. 2021-05-14 12:22:46 -07:00
89fc80b99b Update to the latest version of sobol_burley. 2021-05-14 11:30:48 -07:00
63d661f8ce Update sobol_burley dependency. 2021-05-11 20:17:51 -07:00
706902dc8e Move sobol crate outside of Psychopath into its own repo. 2021-05-11 13:35:17 -07:00
3d85ce8005 Consolidate all of the compact value storage formats into one crate. 2020-12-30 20:41:56 +09:00
6586b38dc9 Use an external crate for fast approximate math functions. 2020-12-26 10:03:35 +09:00
8c738b2f39 Use FloatLuv32 in Psychopath for encoding XYZ colors. 2020-09-20 11:04:37 +09:00
45241784fb Code tidying on the Sobol sampler.
Also swapped the sample index and dimension paramater in the function
signature.  This feels more intuitive.
2020-04-30 22:46:47 +09:00
0dfe916523 Preparing for SIMD accelerated Sobol sampling.
This implements the 4-wide API, and moves the renderer over to it.
But the actual implementation is still scalar.
2020-04-24 21:05:29 +09:00
2c68e18bd6 Use golden ratio sampling for wavelength again.
Now that the Sobol sequence can be decorrelated, this doesn't
introduce sampling correlation problems anymore, so it's mostly
just a win.
2020-04-23 14:46:21 +09:00
29fcc69ae1 Move seed hashing into the lk_scramble function. 2020-04-23 13:36:04 +09:00
c0a8c955c4 Make LightPath::new() harder to mis-use. 2020-04-23 08:32:44 +09:00
22b7151919 Use independent Sobol sequences for different sets of dimensions.
This reduces correlation artifacts, while preserving good convergence
for the most part.
2020-04-22 18:48:12 +09:00
085d1d655e A single unified Sobol implementation.
This version of Sobol implements both Owen scrambling and index
permutation, allowing for multiple statistically independent
Sobol sequences.
2020-04-19 01:11:43 +09:00
b74a58cb72 Improvement for sampling at low sample counts. 2020-04-17 11:04:33 +09:00
8deb305850 Use a much better approximation of the probit function.
For 32-bit floating point, it can essentially be considered exact.
2020-03-27 21:19:24 +09:00
3916043f33 Removed golden ratio sampling.
Turns out it causes interference with the Sobol sampler.

Also tweaked some other things about sampling after removing
golden ratio sampling, to make things better.
2020-03-19 19:49:45 +09:00
9e14e164e7 More improvements to Sobol sampling.
- Added an additional scramble round to the Owen scrambling, with
  new optimized constants.
- Reordered the dimensions of the direction numbers to improve 2d
  projections between adjecent dimensions.  Only did this for
  dimensions under ~40.
2020-03-18 12:05:42 +09:00
de5a643a2a Implement Sobol sampler that does both Owen and Cranley-Patterson.
This seems to work well in practice, and only takes one more addition
operation.
2020-03-17 20:00:09 +09:00
e3152e6f9c Add alternative Sobol direction numbers to the repo.
Also switching to one of the alternates, as it seems to give
better results than the one I was using before.
2020-03-17 16:49:19 +09:00
04a5dbff43 Generate sobol direction numbers from text file.
This way the numbers aren't cluttering up the source file, and
this also makes it easier to play with other direction numbers.
2020-03-17 15:21:15 +09:00
d49a1c4921 Clean up the sampling code a little.
All of the samplers were using the same scramble value, so I
factored it out and documented its intent.
2020-03-16 10:14:09 +09:00
5114d428da Use the seed value in random value generation.
I forgot to add this in.  It wasn't noticable, since the QMC
sequences did use the seed, and we probably don't ever get to
the random values for 15+ light bounces.  But it seems worth
fixing anyway!
2020-03-16 09:57:01 +09:00
deaacd73fb Reuse same hash function for ints and floats.
The code was simply duplicated before, for no real reason.
2020-03-16 09:50:10 +09:00
047e66d9aa Reworked Sobol sampler implementation.
This produces identical results, but generates the direction
vectors from the original sources at build time.  This makes
the source code quite a bit leaner, and will also make it easier
to play with other direction vectors in the future if the
opportunity arises.
2020-03-15 22:01:06 +09:00
42a6c1e9cd Use proper wrapping arithmetic in the golden ratio sampler. 2020-03-15 18:10:03 +09:00
9b4781c81d Multiple improvements to sampling.
1. Use better constants for the hash-based Owen scrambling.
2. Use golden ratio sampling for the wavelength dimension.

On the use of golden ratio sampling:
Since hero wavelength sampling uses multiple equally-spaced
wavelengths, and most samplers only consider the spacing of
individual samples, those samplers weren't actually doing a
good job of distributing all the wavelengths evenly.  Golden
ratio sampling, on the other hand, does this effortlessly by
its nature, and the resulting reduction of color noise is huge.
2020-03-15 14:47:40 +09:00
e0cb436209 Minor sampling refactoring. 2020-03-13 14:51:14 +09:00
a3ea90afdc Fixed broken Owen scrambling.
The previous implementation was fundamentally broken because it
was mixing the bits in the wrong direction.  This fixes that.

The constants have also been updated.  I created a (temporary)
implementation of slow but full owen scrambling to test against,
and these constants appear to give results consistent with that
on all the test scenes I rendered on.  It is still, of course,
possible that my full implementation was flawed, so more validation
in the future would be a good idea.
2020-03-12 20:20:56 +09:00
b081424ba6 Implemented Owen scrambling for the Sobol sampler.
This gives better variance than random digit scrambling, at a
very tiny runtime cost (so tiny it's lost in the noise of the
rest of the rendering process).
2020-03-11 18:29:46 +09:00
8d16719cd2 Use a different function for giving pixels unique ids. 2020-02-22 11:59:08 +09:00