From 76781eb6393239e1ad516bb55354ad7ed57fb983 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sat, 13 Aug 2022 13:02:47 -0700 Subject: [PATCH] Use new fast hash for base-4 Owen scrambling. --- src/renderer.rs | 4 ++-- src/scramble.rs | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index 8c9bb4f..6fc18d4 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -18,7 +18,7 @@ use crate::{ mis::power_heuristic, ray::Ray, scene::{Scene, SceneLightSample}, - scramble::owen4, + scramble::owen4_fast, space_fill::{hilbert_spiral, morton}, timer::Timer, tracer::Tracer, @@ -233,7 +233,7 @@ impl<'a> Renderer<'a> { // and golden ratio sampling, we do this up-front here rather than in // the samplers themselves. let si_offset = - owen4(morton::encode(x, y), self.seed).wrapping_mul(self.spp as u32); + owen4_fast(morton::encode(x, y), self.seed).wrapping_mul(self.spp as u32); for si in 0..(self.spp as u32) { let mut sample_gen = SampleGen::new(si_offset + si, self.seed); diff --git a/src/scramble.rs b/src/scramble.rs index 89c84e3..c59f0fe 100644 --- a/src/scramble.rs +++ b/src/scramble.rs @@ -16,7 +16,23 @@ pub fn owen2(n: u32, seed: u32) -> u32 { result } -/// Performs a base-4 Owen scramble on an integer. +#[inline(always)] +pub fn owen4_fast(mut n: u32, seed: u32) -> u32 { + let scramble = hash(seed); + + n = n.reverse_bits(); + + n ^= n.wrapping_mul(0x3d20adea); + n ^= (n >> 1) & (n << 1) & 0x55555555; + n = n.wrapping_add(scramble); + n = n.wrapping_mul((scramble >> 16) | 1); + n ^= (n >> 1) & (n << 1) & 0x55555555; + n ^= n.wrapping_mul(0x05526c56); + n ^= n.wrapping_mul(0x53a22864); + + n.reverse_bits() +} + pub fn owen4(n: u32, seed: u32) -> u32 { // Bit-packed permutation table. const PERMUTATION_TABLE: [u8; 24] = [