Noticed that z-scrambling is actually just base-4 Owen scrambling.

Updated function name and comments to reflect that.
This commit is contained in:
Nathan Vegdahl 2022-07-21 04:40:26 -07:00
parent 6b7538e25f
commit 0d71ae86db
2 changed files with 16 additions and 8 deletions

View File

@ -20,7 +20,7 @@ use crate::{
morton,
ray::{Ray, RayBatch},
scene::{Scene, SceneLightSample},
scramble::z_scramble,
scramble::owen4,
surface,
timer::Timer,
tracer::Tracer,
@ -249,7 +249,7 @@ impl<'a> Renderer<'a> {
// and golden ratio sampling, we do this up-front here rather than in
// the samplers themselves.
let si_offset =
z_scramble(morton::xy2i(x, y), self.seed).wrapping_mul(self.spp as u32);
owen4(morton::xy2i(x, y), self.seed).wrapping_mul(self.spp as u32);
for si in 0..self.spp {
let si = (si as u32).wrapping_add(si_offset);

View File

@ -1,7 +1,7 @@
use crate::hash::hash_u32;
/// Performs a base-2 Owen scramble on an integer.
pub fn owen(n: u32, seed: u32) -> u32 {
pub fn owen2(n: u32, seed: u32) -> u32 {
let mut result = n;
for i in 0..32 {
@ -12,11 +12,19 @@ pub fn owen(n: u32, seed: u32) -> u32 {
result
}
/// Performs z-scrambling from the paper "Screen-Space Blue-Noise
/// Diffusion of Monte Carlo Sampling Error via Hierarchical Ordering
/// of Pixels" by Ahmed et al., except using a more complete and
/// efficient algorithm based on the Owen scrambling function above.
pub fn z_scramble(n: u32, seed: u32) -> u32 {
/// Performs a base-4 Owen scramble on an integer.
///
/// This is motivated by z-scrambling from the paper "Screen-Space
/// Blue-Noise Diffusion of Monte Carlo Sampling Error via Hierarchical
/// Ordering of Pixels" by Ahmed et al. Their scrambling function is
/// actually just Owen scrambling in base 4, but their attempt at
/// implementing that function isn't great, both in terms of memory
/// usage and scramble quality. (The paper itself is otherwise
/// fantastic, though.)
///
/// The implementation below is a full proper base-4 Owen scramble,
/// requiring only a 24-byte lookup table.
pub fn owen4(n: u32, seed: u32) -> u32 {
const PERM_TABLE: [u8; 24] = [
0 | (1 << 2) | (2 << 4) | (3 << 6), // [0, 1, 2, 3],
0 | (1 << 2) | (3 << 4) | (2 << 6), // [0, 1, 3, 2],