From f94bc8827d00ea0256a22930e9e0261a94f7dd94 Mon Sep 17 00:00:00 2001 From: sicsix <8847273+sicsix@users.noreply.github.com> Date: Wed, 18 Jun 2025 08:28:05 +1000 Subject: [PATCH 1/2] feat: add fast random float gen based on pcg --- package/Shaders/Common/Random.hlsli | 74 +++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/package/Shaders/Common/Random.hlsli b/package/Shaders/Common/Random.hlsli index c039cf3826..070ce6a597 100644 --- a/package/Shaders/Common/Random.hlsli +++ b/package/Shaders/Common/Random.hlsli @@ -102,10 +102,11 @@ namespace Random return fmix(h); } - uint pcg(uint v) + uint pcg(inout uint state) { - uint state = v * 747796405u + 2891336453u; - uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u; + uint prevState = state; + state = state * 747796405u + 2891336453u; + uint word = ((prevState >> ((prevState >> 28u) + 4u)) ^ prevState) * 277803737u; return (word >> 22u) ^ word; } @@ -151,6 +152,73 @@ namespace Random return n; } + float f1(inout uint seed, out uint word) + { + word = pcg(seed); + uint bits = word & 0x007FFFFFu | 0x3F800000u; + return asfloat(bits) - 1.0f; + } + + float f1(inout uint seed) + { + uint word; + return f1(seed, word); + } + + float2 f2(inout uint seed, out uint word) + { + word = pcg(seed); + uint bits0 = word & 0x007FFFFFu | 0x3F800000u; + uint bits1 = word >> 9 | 0x3F800000u; + float f0 = asfloat(bits0) - 1.0f; + float f1 = asfloat(bits1) - 1.0f; + return float2(f0, f1); + } + + float2 f2(inout uint seed) + { + uint word; + return f2(seed, word); + } + + float3 f3(inout uint seed, out uint word) + { + word = pcg(seed); + uint bits0 = word & 0x007FFFFFu | 0x3F800000u; + uint bits1 = (word << 22 | word >> 10) & 0x007FFFFFu | 0x3F800000u; + uint bits2 = (word << 11 | word >> 21) & 0x007FFFFFu | 0x3F800000u; + float f0 = asfloat(bits0) - 1.0f; + float f1 = asfloat(bits1) - 1.0f; + float f2 = asfloat(bits2) - 1.0f; + return float3(f0, f1, f2); + } + + float3 f3(inout uint seed) + { + uint word; + return f3(seed, word); + } + + float4 f4(inout uint seed, out uint word) + { + word = pcg(seed); + uint bits0 = word & 0x007FFFFFu | 0x3F800000u; + uint bits1 = (word << 24 | word >> 8) & 0x007FFFFFu | 0x3F800000u; + uint bits2 = (word << 16 | word >> 16) & 0x007FFFFFu | 0x3F800000u; + uint bits3 = (word << 8 | word >> 24) & 0x007FFFFFu | 0x3F800000u; + float f0 = asfloat(bits0) - 1.0f; + float f1 = asfloat(bits1) - 1.0f; + float f2 = asfloat(bits2) - 1.0f; + float f3 = asfloat(bits3) - 1.0f; + return float4(f0, f1, f2, f3); + } + + float4 f4(inout uint seed) + { + uint word; + return f4(seed, word); + } + /////////////////////////////////////////////////////////// // BLUE-LIKE HASHES / LOW DISCREPANCY SEQUENCES /////////////////////////////////////////////////////////// From fcb0d0e5f82d38b9bc9a6db868442053135db0ee Mon Sep 17 00:00:00 2001 From: sicsix <8847273+sicsix@users.noreply.github.com> Date: Wed, 18 Jun 2025 09:19:23 +1000 Subject: [PATCH 2/2] small tidy, clearer variable names --- package/Shaders/Common/Random.hlsli | 75 +++++++++++++---------------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/package/Shaders/Common/Random.hlsli b/package/Shaders/Common/Random.hlsli index 070ce6a597..ed79724cb8 100644 --- a/package/Shaders/Common/Random.hlsli +++ b/package/Shaders/Common/Random.hlsli @@ -152,71 +152,62 @@ namespace Random return n; } - float f1(inout uint seed, out uint word) + float f1(inout uint state, out uint randBits) { - word = pcg(seed); - uint bits = word & 0x007FFFFFu | 0x3F800000u; + randBits = pcg(state); + uint bits = randBits & 0x007FFFFFu | 0x3F800000u; return asfloat(bits) - 1.0f; } - float f1(inout uint seed) + float f1(inout uint state) { - uint word; - return f1(seed, word); + uint randBits; + return f1(state, randBits); } - float2 f2(inout uint seed, out uint word) + float2 f2(inout uint state, out uint randBits) { - word = pcg(seed); - uint bits0 = word & 0x007FFFFFu | 0x3F800000u; - uint bits1 = word >> 9 | 0x3F800000u; - float f0 = asfloat(bits0) - 1.0f; - float f1 = asfloat(bits1) - 1.0f; - return float2(f0, f1); + randBits = pcg(state); + uint bits0 = randBits & 0x007FFFFFu | 0x3F800000u; + uint bits1 = randBits >> 9 | 0x3F800000u; + return float2(asfloat(bits0), asfloat(bits1)) - 1.0f; } - float2 f2(inout uint seed) + float2 f2(inout uint state) { - uint word; - return f2(seed, word); + uint randBits; + return f2(state, randBits); } - float3 f3(inout uint seed, out uint word) + float3 f3(inout uint state, out uint randBits) { - word = pcg(seed); - uint bits0 = word & 0x007FFFFFu | 0x3F800000u; - uint bits1 = (word << 22 | word >> 10) & 0x007FFFFFu | 0x3F800000u; - uint bits2 = (word << 11 | word >> 21) & 0x007FFFFFu | 0x3F800000u; - float f0 = asfloat(bits0) - 1.0f; - float f1 = asfloat(bits1) - 1.0f; - float f2 = asfloat(bits2) - 1.0f; - return float3(f0, f1, f2); + randBits = pcg(state); + uint bits0 = randBits & 0x007FFFFFu | 0x3F800000u; + uint bits1 = (randBits << 22 | randBits >> 10) & 0x007FFFFFu | 0x3F800000u; + uint bits2 = (randBits << 11 | randBits >> 21) & 0x007FFFFFu | 0x3F800000u; + return float3(asfloat(bits0), asfloat(bits1), asfloat(bits2)) - 1.0f; } - float3 f3(inout uint seed) + float3 f3(inout uint state) { - uint word; - return f3(seed, word); + uint randBits; + return f3(state, randBits); } - float4 f4(inout uint seed, out uint word) + float4 f4(inout uint state, out uint randBits) { - word = pcg(seed); - uint bits0 = word & 0x007FFFFFu | 0x3F800000u; - uint bits1 = (word << 24 | word >> 8) & 0x007FFFFFu | 0x3F800000u; - uint bits2 = (word << 16 | word >> 16) & 0x007FFFFFu | 0x3F800000u; - uint bits3 = (word << 8 | word >> 24) & 0x007FFFFFu | 0x3F800000u; - float f0 = asfloat(bits0) - 1.0f; - float f1 = asfloat(bits1) - 1.0f; - float f2 = asfloat(bits2) - 1.0f; - float f3 = asfloat(bits3) - 1.0f; - return float4(f0, f1, f2, f3); + randBits = pcg(state); + uint bits0 = randBits & 0x007FFFFFu | 0x3F800000u; + uint bits1 = (randBits << 24 | randBits >> 8) & 0x007FFFFFu | 0x3F800000u; + uint bits2 = (randBits << 16 | randBits >> 16) & 0x007FFFFFu | 0x3F800000u; + uint bits3 = (randBits << 8 | randBits >> 24) & 0x007FFFFFu | 0x3F800000u; + return float4(asfloat(bits0), asfloat(bits1), asfloat(bits2), asfloat(bits3)) - 1.0f; } - float4 f4(inout uint seed) + float4 f4(inout uint state) { - uint word; - return f4(seed, word); + uint randBits; + return f4(state, randBits); } ///////////////////////////////////////////////////////////