123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #ifndef _SAMPLING_HASHES_HLSL_
- #define _SAMPLING_HASHES_HLSL_
-
- // Low bias hash from https://github.com/skeeto/hash-prospector
- uint LowBiasHash32(uint x, uint seed = 0)
- {
- x += seed;
- x ^= x >> 16;
- x *= 0x21f0aaad;
- x ^= x >> 15;
- x *= 0xd35a2d97;
- x ^= x >> 15;
- return x;
- }
-
- // Murmur Hash from https://github.com/aappleby/smhasher/wiki/MurmurHash3
- uint MurmurAdd(uint hash, uint item)
- {
- item *= 0xcc9e2d51;
- item = (item << 15) | (item >> 17);
- item *= 0x1b873593;
-
- hash ^= item;
- hash = (hash << 13) | (hash >> 19);
- hash = hash * 5 + 0xe6546b64;
- return hash;
- }
-
- uint MurmurFinalize(uint hash)
- {
- hash ^= hash >> 16;
- hash *= 0x85ebca6b;
- hash ^= hash >> 13;
- hash *= 0xc2b2ae35;
- hash ^= hash >> 16;
- return hash;
- }
-
- uint MurmurHash(uint x, uint seed = 0)
- {
- uint h = seed;
- h = MurmurAdd(h, x);
- return MurmurFinalize(h);
- }
-
- uint MurmurHash(uint2 x, uint seed = 0)
- {
- uint h = seed;
- h = MurmurAdd(h, x.x);
- h = MurmurAdd(h, x.y);
- return MurmurFinalize(h);
- }
-
- uint MurmurHash(uint3 x, uint seed = 0)
- {
- uint h = seed;
- h = MurmurAdd(h, x.x);
- h = MurmurAdd(h, x.y);
- h = MurmurAdd(h, x.z);
- return MurmurFinalize(h);
- }
-
- uint MurmurHash(uint4 x, uint seed = 0)
- {
- uint h = seed;
- h = MurmurAdd(h, x.x);
- h = MurmurAdd(h, x.y);
- h = MurmurAdd(h, x.z);
- h = MurmurAdd(h, x.w);
- return MurmurFinalize(h);
- }
-
- uint XorShift32(uint rngState)
- {
- rngState ^= rngState << 13;
- rngState ^= rngState >> 17;
- rngState ^= rngState << 5;
- return rngState;
- }
-
- // From PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation.
- // and "Hash Functions for GPU Rendering" paper
- uint Pcg(uint v)
- {
- uint state = v * 747796405u + 2891336453u;
- uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;
- return (word >> 22u) ^ word;
- }
-
- uint2 Pcg2d(uint2 v)
- {
- v = v * 1664525u + 1013904223u;
-
- v.x += v.y * 1664525u;
- v.y += v.x * 1664525u;
-
- v = v ^ (v >> 16u);
-
- v.x += v.y * 1664525u;
- v.y += v.x * 1664525u;
-
- v = v ^ (v >> 16u);
-
- return v;
- }
-
- uint3 Pcg3d(uint3 v)
- {
- v = v * 1664525u + 1013904223u;
-
- v.x += v.y * v.z;
- v.y += v.z * v.x;
- v.z += v.x * v.y;
-
- v ^= v >> 16u;
-
- v.x += v.y * v.z;
- v.y += v.z * v.x;
- v.z += v.x * v.y;
-
- return v;
- }
-
- uint4 Pcg4d(uint4 v)
- {
- v = v * 1664525u + 1013904223u;
-
- v.x += v.y * v.w;
- v.y += v.z * v.x;
- v.z += v.x * v.y;
- v.w += v.y * v.z;
-
- v = v ^ (v >> 16u);
-
- v.x += v.y * v.w;
- v.y += v.z * v.x;
- v.z += v.x * v.y;
- v.w += v.y * v.z;
-
- return v;
- }
-
- #endif // _SAMPLING_HASHES_HLSL_
|