Hacker News new | ask | show | jobs
by recursive 265 days ago
I don't know much about 3d stuff or shaders or this language, but I know golf, and I think I found a byte to save.

    w = g-g*exp(-mix(h*3e2,d*2.5,a=h<.001?0.:1.))
    w = g-g/exp(mix(h*3e2,d*2.5,a=h<.001?0.:1.))
2 comments

You can also premultiply w with a, as every occurrence of `w` looks like `w*a`. This should shave three more bytes:

  w=g-g*exp(...),g-=w*a,c+=w*a*d*9.+...,c.r+=w*a*a*2,...
  w=g-g*exp(...),g-=w*=a,c+=w*d*9.+...,c.r+=w*a*2,...
(I've tested this with the Shadertoy version. YMMV.)
This is not equivalent; the `a` in `c.r+=w*a` is different, you need the original untouched w. The mountain looses its crack with your version.

But! You can save 1 char by replacing w with a:

    g -= a*=w,
    c += a*d*9.+...
    a = min(...),
    c.r += w*a*a*.2,
So thank you for the idea!
Hey, thank you, that's a nice one. I added the change to the Shadertoy version with your credit. I will add a note/update on the blog and demo page later. Thanks again :)
Is it actually necessary to specify `a` as a floating-point literal? Will it not be implicitly converted?
Yeah. If you want implicit conversion, you need to specify a constructor like float(cond), but that would be longer than the ternary form. I thought about using a vec3() but vec3(...).x is still too long and using the vec3 directly doesn't look viable. Declaring a bool adds more characters as well. There is also step() giving the same number of chars: a=step(.001,h), but it's not more optimal: https://iquilezles.org/articles/gpuconditionals/

If you see a way to make it shorter, feel free to share :)