0

For a noise shader I'm looking for a pseudo random number algorithm with 3d vector argument, i.e., for every integer vector it returns a value in [0,1]. It should be as fast as possible without producing visual artifacts and giving the same results on every GPU.
Two variants (pseudo code) I found are

   rand1(vec3 (x,y,z)){
       return xorshift32(x ^ xorshift32(y ^ xorshift32(z)));
   }

which already uses 20 arithmetic operations and still has to be casted and normalized and

   rand2(vec3 v){
       return fract(sin(dot(v, vec3(12.9898, 78.233, ?))) * 43758.5453);
   };

which might be faster but uses sin causing precision problems and different results on different GPU's.

Do you know any other algorithms requiring less arithmetic operations? Thanks in advance.

Edit: Another standard PRNG is XORWOW as implemented in C as

xorwow() {
    int x = 123456789, y = 362436069, z = 521288629, w = 88675123, v = 5783321, d = 6615241;
    int t = (x ^ (x >> 2));
    x = y;
    y = z;
    z = w;
    w = v;
    v = (v ^ (v << 4)) ^ (t ^ (t << 1));
    return (d += 362437) + v;
}

Can we rewrite it to fit in our context?

JHT
  • 143
  • 4
  • You could try some IEEE-754 float hacking to do that: generate random bits and put them in the mantissa part. – Jérôme Richard Jul 09 '21 at 17:19
  • https://www.thesalmons.org/john/random123/ is a paper I read a while ago and sounds relevant. I'd use integer operations where possible if you want consistency across implementations – Sam Mason Jul 11 '21 at 21:26

0 Answers0