3 ms·
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.
by recursive 1y 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.))
- ux 1y agoHey, 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 :)
- zahlman 1y agoIs it actually necessary to specify `a` as a floating-point literal? Will it not be implicitly converted?
- ux 1y agoYeah. 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/ https://iquilezles.org/articles/gpuconditionals/ If you see a way to make it shorter, feel free to share :)
- lifthrasiir 1y agoYou 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.)
- ux 1y agoThis 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!