6 ms·
Code golfing a tiny demo using maths and a pinch of insanity
- bangaladore 1y agoThe top demo doesn't function on Edge or Chrome on Windows due to too many webgl contexts. > WARNING: Too many active WebGL contexts. Oldest context will be lost.
- ux 1y agoAh, someone reported this to me today, but I must admit I have no idea how to address the issue. Currently the canvas animations are stopped when out of context, but yeah they have to be loaded. The code on the blog is pretty simple and naive (I'm not a webdev): https://github.com/ubitux/scripts/blob/main/share/blog/shader.js https://github.com/ubitux/scripts/blob/main/share/blog/shade... Any suggestion on how to address the issue is welcome. Note: I don't have any Windows machine to test with
- timojaask 1y agoSimilar issue on iOS Safari: all examples work except for the very first one.
- sgarland 1y agoIt loaded fine for me. iOS 26.0, iPhone 16 Pro.
- greggman65 1y agoIf you just want it to work, stick this script on your page https://github.com/greggman/virtual-webgl https://github.com/greggman/virtual-webgl If you want to make your own solution there's one listed here about 1/2 way down the page https://webglfundamentals.org/webgl/lessons/webgl-multiple-views.html https://webglfundamentals.org/webgl/lessons/webgl-multiple-v... As an aside, WebGPU doesn't have this issue or at least has it less. For one, WebGPU can use a single device to render to multiple canvases, something WebGL can't. Another is that WebGPU is mostly stateless making it easier for both the user and the browser.
- ux 1y agoIncredible, thank you very much. I've included the script for a quick fix, I'll see how to make to cook something myself at some point!
- user1093298 1y agoWorks fine with Firefox on Windows. What am I saying? Fine? It's freaking awesome.
- recursive 1y agoI 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!
- vintermann 1y agoUsing maths, insanity, and a ton of calculation horsepower... That made my graphic card fan turn on instantly!
- samwhiteUK 1y agoUnbelievably cool, well done!
- ForHackernews 1y agoIf anyone is interested in learning more about this kind of coding https://thebookofshaders.com/ https://thebookofshaders.com/ is a fantastic intro.
- ux 1y agoIs this tutorial kind of abandoned? There are many teased chapters that never seem to have materialized somehow.
- sgarland 1y agoThis is utterly bonkers to me, well done.
- mielioort 1y agoNeeds dragons flying sunwards
- mkbosmans 1y agoAnother two bytes found (I think) (d==0.?K*.01*h:c-c) could become (d>0.?.0:.01)*K*h
- ux 1y agoAh nice for noticing d!=0 is d>0. Not sure how I missed the multiplication to get rid of the vector form; I guess I was too obsessed with the x-x trick... I added your changes to the Shadertoy version with your HN nickname. I'll integrate it to the original later. Thanks!
- mkbosmans 1y agoI saw that you used `float z;` to later use `z` instead of the constant `0.`. You can also apply that to get a zero vector: `vec3 y;` and use `y` in place of `p-p`. It seems that leaving the obsession behind some more can save another byte.