Commit Graph

442 Commits

Author SHA1 Message Date
cda9156af8 Optimize FloatLuv decoding.
Speed ups of over 20%.
2020-09-20 01:43:36 +09:00
03bedcb594 Cleanup, tweaks, and better documentation for the 32-bit Luv format. 2020-09-19 23:57:59 +09:00
485da9f918 Add a new 32-bit Luv color format.
It's based on the SGI LogLuv format, but using a floating point
instead of log encoding for the luminance.
2020-09-19 19:51:40 +09:00
66e9abe66e Make signed48 trifloat encoding also a byte array.
Same reason as for the unsigned40 encoding in an earlier commit.
2020-09-19 12:22:51 +09:00
49c97bf0fe Cleaned up the signed48 trifloat code. 2020-09-19 08:55:35 +09:00
fd98b33333 Make unsigned40 trifloat encoding a byte array.
The whole point of these formats is to compress down to less
space, so let's not leave actually putting it in the space-saving
form on the client code.
2020-09-19 08:28:59 +09:00
9fb3c95171 Added an unsigned 40-bit trifloat format.
It is identical to the 32-bit format, except with more precision
and range due to using more bits.  This format should comfortably
store any color information with precision easily exceeding the
limits of human vision.
2020-09-18 22:12:12 +09:00
96b8dd84b9 Cleaned up the u32 trifloat implementation.
This also makes encoding faster.  However, it no longer does
rounding to the nearest precision when encoding, and insead does
flooring.  This seems like a reasonable tradeoff: if you want more
precision... you should use a format with more precision.
2020-09-18 21:04:16 +09:00
f13ffac7bd Removed the experimental luma-chroma color format.
It was a worthwhile experiment, but for it to really work it needs
a really proper luma-chroma separation, which is both slower than
I really want, and requires knowing the colorspace being used.

I might make another go at this based on the TIFF LogLUV color
format, requiring XYZ as input.
2020-09-18 17:57:13 +09:00
c1f516c2b6 Use a better chroma formula for the RGB32 format.
This makes much better use of the bit space.
2020-09-13 11:22:48 +09:00
bd6cf359b4 Some code clean-up in the RGB32 encoding/decoding code. 2020-09-13 06:44:42 +09:00
d6ab9d06be More work on the packed HDR RGB 32-bit format.
Switched to a different chroma encoding, which is notably faster
and never produces negative values when decoded.
2020-09-11 21:57:43 +09:00
339568ec0c Remove stale comments. 2020-09-10 22:42:20 +09:00
7066c38189 Implement an experimental packed HDR RGB 32-bit storage format. 2020-09-10 22:36:20 +09:00
99b6ddfa54 Run clippy on Sobol sampler, and fix/silence warnings. 2020-05-01 16:07:19 +09:00
78acaa7b63 Make Sobol SIMD code work on all x86-64 platforms.
Before this it needed SSE 4.1, which is not strictly present on
all x86-64 platforms.  This will still compile the faster path if
SSE 4.1 is available, but has an alternate path as well for all
x86-64 platforms.
2020-05-01 15:32:18 +09:00
fd75a72655 More code tidying of the Sobol sampler.
In particular, clearer and more concise documentation.
2020-05-01 10:42:02 +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
1f75e7854e Properly hash all four scramble values in the 4d Sobol sampler. 2020-04-25 18:12:35 +09:00
72adbedbb4 Accelerate the Sobol sampler with SIMD on x86_64. 2020-04-24 23:32:43 +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
78b5cf4c53 Faster lk hash for the sobol sampler.
This gets about the same quality as the previous hash, but in
much fewer operations.
2020-04-24 10:47:53 +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
3ffaf7bee5 Forgot to use a wrapping multiply instead of a straight multiply. 2020-04-23 13:52:04 +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
b776bf56b8 Improved lk scrambling function.
This actually gets very close to the behavior of a full per-bit
hash, except that you still need a fairly random seed.
2020-04-23 08:31:03 +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
aecff883ab Misc optimizations on the Sobol sampler.
The biggest one is avoiding a bunch of bit reversals by keeping
numbers in bit-reversed form for as long as we can.

Also reduced the hashing rounds: just 2 rounds seems to be enough
for a reasonable amount of statistical independence on both the
scrambling and shuffling.  I tested both independently, keeping
the other with no scrambling/shuffling respectively.  This makes
sense because in normal contexts 3 is enough, but in this case
both act as input to yet another hash which is effectively doing
more rounds.
2020-04-22 16:21:50 +09:00
660576ec2b Make Sobol seeding more robust.
This way incremental seeds can be passed (e.g. 0, 1, 2, etc.) and
still get statistically independent Sobol sequences.
2020-04-22 14:19:57 +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
f36b71184a Use better seeding for slow version of Owen scramble as well. 2020-04-17 13:18:37 +09:00
b74a58cb72 Improvement for sampling at low sample counts. 2020-04-17 11:04:33 +09:00
c4e1bedd43 Improve Owen scrambling by seeding with add instead of xor.
Also removed some unnecessary complexity from the implementation,
and use different constants.
2020-04-17 10:42:35 +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
e46fc5a4d6 Cleaning up Sobol sampling code.
In particular, removing some things I tried when the golden ratio
sampling was causing problems, but that are now no longer needed.
2020-03-21 09:00:43 +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
e014df2b1a Fix rare panic in Sobol sampler.
Due to the undefined behavior of shifting a number by its
bit-width, the Sobol sampler would panic when sample index
`1 << 15` was requested.

This fixes it without introducing any additional checks or
operations.
2020-03-19 09:59:19 +09:00
7daa133e15 Only use 16 bit integers for generating Sobol samples.
This limits the number of samples per dimension to 2^16, but that
should be more than enough for any rendering situation.  And this
reduces the direction numbers table size by a factor of 4.

This commit also takes advantage of the reduced bit space to
provide even better Owen scrambling, by utilizing the unused
16 bits for better mixing.
2020-03-19 08:58:42 +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
9c20c7a02f Improve Owen scrambling and add Cranley-Patterson rotation.
- Updated constants for Owen scrambling, based on better optimization
  criteria.
- Increased randomness for the higher bits in the Owen scrambling.
- A simple and efficient implementation of Cranley-Patternson rotation
  for the Sobol sampler.
2020-03-17 12:26:02 +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
420e078b70 Some cleanup of the comments in the last commit. 2020-03-15 22:37:34 +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