I Made Falling Sand Games in a Fragment Shader
Вставка
- Опубліковано 22 лис 2024
- Most popular falling sand games like Noita do falling sand simulations on the CPU. For the last few weeks though I've been experimenting with writing falling sand simulations that run instead in a fragment shader which uses the GPU. In this video I’ll show you how this is even possible and some of the insane things I was able to make with it.
Link to Paper (Probabilistic Cellular Automata for Granular Media in Video Games):
arxiv.org/pdf/...
You can now support me on Patreon:
/ yusef28
I'm glad this video (and my previous one) was so well recieved. I just wanted to quickly mention the code snippets I showed of my projects later on in the video are not meant to be an example of how you should code this. I basically hacked something together as proof of concept. It ended up being as fast as I needed but there are better ways of writing it.
Dude that is the coolest camera effect I’ve ever seen, crazy unique!
Thanks, I'm really glad to hear that!
nice sand
but hey falling sand games never stopped being popular :)
also sandspiel partly works on the gpu!
Hi todepond!
Thanks, I learned quite a bit from your videos. Well fair enough! And good to know about sandspiel.
I had a feeling id find you here lol, keep up the cool work TodePond
waahhhh I love this recent resurgence of falling sand games... I used to play them so much as a child
i loved the powder game
powder game and powder toy my beloved
@@cerulity32k Yeah!!!!! both of these were so peak
that final video effect was SICK
Ok nice I'm glad people are liking that one!
Thought this was going to be a generic falling sand vid, but at 2:46 you actually solved a problem i had. Cheers mate
Thanks for this feedback, and I see a number of people liked your comment as well. I'm glad my content is helping.
8:24: working in a huge Blender project with cycles enabled
Dude that research paper section was awesome. Wow.
Edit: HAHA AND THE BEES START EATING THRU HIS HEAD love it.
Honestly as far as a rts strategy game goes I think u could so follow your original inspiration. Like, I would so play a game ABOUT specifically building up my bee colony in someone's attic so that it can ultimately crash down on their heads. But if you aren't smart about it, you might alert them to your presence early and get messed up by the exterminators. It can be all-out warfare.
Thanks for all the great feedback. You're right and that idea reminds me of a game called Sim Ant from the 90s. I'll keep this idea in mind!
This is very cool, i love falling sand code and shader code but i never thought about how cool it would be to combine it like that
You’re awesome. Your ascii render system gave me a great idea for a game and once i get a couple CS classes under my belt, i’m gonna try and bring it to life
Excellent, I think it's great that you already have a project idea in mind while starting CS. That's the best way imo. Good luck with your studies and the game!
thee aesthetic is so cooll, i love the magic hands ah scene, Really feels like that dark mysterious Inscription vibe 🤌
Thanks! That's the vibe I was going for.
Love it, that is an extremely cool effect! Thanks for sharing your journey with us on this project. Kudos!!!
My pleasure!
You've got the most creative graphics programming videos ive ever seen, this is so fucking trippy, I love it
Thanks a lot!
That falling ASCII video effect is amazing. I can totally see someone using it for a Hollywood hacker or AI character in a movie.
Usually I don't like most of the
Using that grid system to make the particles fall and roll off eachother is genius! It totally negates the need for IFs !!! You could just make a 1-domensional look-up array that only needs 4 bits to define it's indices and values! This has given me all kinds of optimisation ideas! Thanks for this.
9:48 this looks like it could make an awesome boss arena, with the player on the platform and the sand video giant doing attacks
I think that's an awesome idea!
That falling sand video idea is really, really cool.
thats really cool way to use the falling sand concept !
You've got something crazy good here man
Combining this with ascii characters was a really cool idea. I love the effect that creates
That falling sand shader effect is crazy!! I'd be really interested in seeing this in a game
Agreed I'd like to see it in a game as well!
this video did NOT go where I expected with that whole bee thing LMAO
Woahhh i gotta rewatch this when im less busy and program all the same stuff. Super cool!
Damn the final video effects look really awesome!
This is great to hear, thanks!
The effects look really cool, great work!
This is brilliant!
Oh hey, it’s you!
Eyyy.
This is awesome. I used to love playing around with sand games on my first smartphone almost 10 years ago.
Looks like so much fun. Thanks for sharing!
I'm glad you enjoyed and oh yes these projects were a lot of fun
The Ascii sand was so cool! All I was thinking was "music video"
I don't know crap about shaders, could you use audio to dynamically effect the rules?
Like an equalizer, certain frequency bands could change various properties, like low kicks make the sand gravity reverse briefly so it adds thump to the visual? High frequency changing color, etc etc.
If that was bundled with a frontend to make it easy for the user to tweak parameters, frequency bands, palettes, refresh rate, etc, I could see some money. Live Concert Visuals even let alone slick video edits.
AND this is on an old laptop 🤯 Truly incredible stuff man, looking forward to more!
This is an excellent idea! yes you can make the sand reverse directions and you can drive that by audio so what you are imagining is totally doable.
I've got to try this. Super cool video man!!
Appreciate it, and good luck with your project!
This is sick. Great vid. Video-based falling sand is an awesome concept.
Thanks this is great to hear!
Awesome! Keep videos like this coming!
Love using an automata to describe falling sand, galaxy brain idea!
the ascii example was amazing! such a cool effect
This is the coolest thing ever! I'm into graphics and visual effects myself, so I might try to mess around with it and see if I get any wacky ideas!
Awesome I hope you go for it!
Great video and research! I really enjoyed some of the effects you came up with. Super inspiring! Thanks for sharing.
Thanks and it's great to hear the research paid off!
oh, graphics programming is so cool man, great video!
Thanks and agreed its awesome!
You have a gift for this stuff. IMO you should think about cinema. A collab with a documentary film maker for some suitably avant garde subject could be dynamite.
Oh thanks and yes I could totally see myself doing something avant garde so it's very interesting that you mention it.
Man, you are something else. Such a simple concept but so many interesting things you managed to come up with and implement.
Oh great feedback thanks, I'll have to keep the ideas coming then!
YOOOOOO using the webcam is such a good idea, that matrix effect is awesome
I'm glad you think so!
yaaay falling sand :D i love making these types of games, that camera effect is awesome too T^T
They are super fun! I'm glad you liked it!
I really like how the interaction between falling sand and water almost creates these pseudo air bubbles that rise up. Awesome emergent behavior
Oh yes I noticed this emergnet behaviour as well!
Hey Yusef! Really enjoy your videos! Keep up with the awesome work, Cheers!
Thanks, will do!
watched this & the ascii shader video, your style reminds me a lot of the sebastian lague coding adventures series which i love to see
Well I must be doing something right then, thanks for this feedback!
Very cool effect! 🔥✨
Awesome. Doing things in fragment shaders is a great restriction to inspire creativity. The Margolus Neighbourhood approach was genius!
Oh yes, and so far I've only been using shadertoy which is even more restrictive. and agreed about the approach!
This would be a killer effect in a music video or something
Agreed!
Really neat. Good job
THIS IS AWESOME!!! I do wonder about how useful it would be in an actual game though. The main problem I see is reading the pixels type on the cpu side for other game logic, it would take quite some time to send the data down and the weird update order might be harder to work with then traditional cpu based sand engines. But if you could get it to work it would certainty be WAY FASTER than the cpu!
Yeah I haven't worked that out myself either to be honest haha.t I know some games like Space Simulation Took Kit say they use the GPU for simulation so someone out there knows how.
your videos are simply fascinating, love ur content man keep up the good work :)
Thanks and will do!
Dude your videos ideas are awesome, I discovered you with the ascii shader. I am really excited for the next ideas
so cool and so clever :)
I gave up on gpu falling sand, its so much harder than other cellular automata like smoothlife
Well if you ever come back to it you have a method now. Smoothlife is awesome too!
Amazing work
The falling sand was cool. But that video effect was phenomenal. The artist inside of me went wild with ideas.
I'm glad to hear that! Yeah I went roughly in order of how I came to each idea so the video effect ended up being later in the video although it's one of the best for sure!
Very interesting video all throughout. Great work man
That was frikkin' sweet man! Looking forward to your next video!
Thanks!
This is so great!
this is really awesome
This is so cool!
Wonderful stuff
very relaxing and informative, keep it up!
this and the last video earned you a sub, keep up the experiments!
Great I'm glad you liked it!
I thought you were going to just make gpu accelerated noita, but the bees concept looks pretty novel and interesting. I liked the edge detection falling sand the best, especially during slower moving scenes.
Take all the if-statements out of your shader, it will perform better. Not a lot of people completely understand branching is usually just if statements.
I truly don’t believe you did all this on a 950m!!! The dedication is real! Awesome video 👍👍👍
Very good point about the if statements. I might have to pin a comment that my code is not the best example of how to do this. It's not optimized or that easy to work with long term, it just got the job done. About the 950m, and I've done way more intensive graphics stuff with this over the years and it's held up.
awesome video, good job
you have a great voice for this stuff, this was really relaxing to watch! could you avoid the branching by having a LUT?
Thanks that's good to here about my voice. I haven't looked into any optimizations but I imagine LUTs could be one.
this is epic!
The ASCII effect on your face was *unreal*
that's funny because initiallly I was against uploading a badapple on youtube at all but then recently just decided oh why not
@@Yusef28 I must admit my ignorance, I have no idea what a badapple is 😂 but that video effect was amazing, really just, stunning. Like something from Ghost in the Shell, or Neuromancer. You are super talented man
Oh I commented this under the wrong comment apparently, so my bad there. I'm glad you liked the ASCII effect though it's one of my favourites. Thank-you also for your kind words here too!
It's awesome to see new falling sand projects and experiments being made. Great vid!
Glad you enjoyed it!
this is really cool!!
This is so cool
Cool stuff, using similar techniques you could probably do anthill optimization or physarum simulations.
Oh yeah I could definitely see that!
This is soo cool
Really Cool :) 👍
I always wanted to try this out it in compute shaders, but I never really thought about fragment shaders which operate per pixel. Which makes a lot more sense! I might give this a try in my Vulkan engine some time!
Ok sweet I hope you go for it!
@@Yusef28 😭I spent 30 mins trying to get an additional 200 fps on a model renderer
4.6k fps on debug builds isn't enough!!!!
I'm only seeing this now, since I wasn't filtering comments properly but that's a lot of fps!
@@Yusef28 I have put it down for now to pursue work. I eventually may come back to it however.
Damn you I was just learning parallel computing and shaders to do something like this
Oh perfect timing then!
This is really cool. the only thing that bothered me was how chunky the water was. But other than that, it was interesting
Fair point. I didn't spend enough time on water for sure. One challenge is dispersion which on the CPU means sending the water cell multiple cells across in a given direction in one frame where possible. On the GPU that's more challenging.
Great video! Definitely solved a problem that I was running into! With this Margolus neighborhood approach, how do you handle individual interactions when adding a new material? such as adding "stone" or "wood", would you have to create all possible interactions sand has with these? I'm eager to look at your code when it's available!
Good question and the answer is so far I found ways to cheat. For any static (doesn't move once placed) material like stone I just have no interactions listed. That means in a margolus neighborhood with stone in it, nothing will happen. So sand that falls on it wont be processed in frames where it's margous neighborhood has stone. Another cheat like with honey eating through wood is I just only process intereactions where there is wood and honey in the same neighborhood block and I pick a random wood cell to turn into honey in that case. So the rule set consists of just two random checks. It is hard to explain further because the data structures I use do a lot of the heavy lifting (albeit badly). I've had to step away from the code for a while but once I'm able publish on shadertoy I'll make a community post about it.
I literally had this idea in the car, just today for a project
Oh nice, I hope you make something awesome!
@@Yusef28 Damn, now I have to make something lol. The initial plan was to do it with webgpu and host it in the cloud, but I'm realizing that webgpu isn't actually ready for web... but it is ready for native desktop apps. So now it's become 2 projects... porting the webgpu game of life to JS... and doing a falling sand webgpu sim in rust.
Wow, ok lot's technoogies to be familiar with for this project, sounds great!
so much sand... you'll be finding it in your shoes for months.
THE POWDER TOY MENTIONED
8:20 - youtube compression: "AWW HELL NAWWW"
sand 👍
bro wtf, this is so fucking cool
dang this video quality!
Damn, people are so smart. That 2x2 grid idea would never come to me.
maybe i would have tried a pseudorandom generator taking the uv coordinates to decide probablistically whether its falling right or left which both pixels diagonally below compute but only one/or the other diagonal is selected.
@@theevilcottonball You could also precompute the random value once for the next frame but I don't know if it's actually better
Really cool, I was expecting to see the view count be around 5 digits not 3
I have a question. I've only just gotten into coding. (Using C)
So, I know I'm a ways off on having the knowledge to do this but, say you wanted to have a desktop screen saver that is procedurally generated with basic AI behaviors with minimum load on CPU. Like zombies chasing humans.
Is something like fragment shaders what you would be working with primarily? I've tried to look up information of the topic but haven't had much luck finding anyone doing something similar except the old pipes screen saver kinda.
Great video by the way. Just found your channel and have been enjoying your videos. :)
Well I think it depends on how complex a scene you end up rendering. Simple art shouldn't be an issue, although I haven't build a shader screen saver. Glad to hear you're enjoying the videos!
Space simulation toolkit is a cool similar project I think.
Oh yes and from what I've read they actually use the GPU heavily for it as well
graphics programmers do the coolest shit
Impressive
Sand rules!!
Yoo this shit is sick af!
my suggestions is to use arithmetic instead of branching on the GPU, would boost the performance even more
Oh yes I should mention my code is not an example of how to do this. It's still very rough until now and another method like you suggest could improve both perfomance and make it less of a pain to work with. I might have to pin a comment about that.
Really cool, i think you gave me an idea to make a video, do you have the code somewhere? I’m not much of a programmer, only a filmaker. Great video!
Glad to hear it! I'm planning to make some of it public soon so I'll let you know when I do.
I think all videos should use the falling sand filter
Yes, I love it!
I might have a good solution for fixing the chunkiness of falling particles, they need to check whether the particle underneath moved down the previous frame in the preferable direciron and if it did the particle above can move. That way you can have continuous streams. It won't always be visible which particle moves where but neither is real sand if they're homogenous color.
The falling sand looks a bit weird because there is always one empty horizontal line every 2 pixels.
I wonder if using the magnitude of motion vectors or some other technique that detects change/rate of change to set the lifetime of sand.
Then something static will hang around but when it moves the screen will update more rapidly and sand will pour off and disappear rapidly with it.
oh yeah that could be really cool. I've put motion vectors on the list of things to look into since a lot of people are interested in that it seems.
that ascii falling sands thing is amazing
very cool! how would one to go about implementing rigid bodies? i already have problems implementing them on the cpu, but cant imagine the work needed for them to work on the gpu
yeah good question and I don't know haha. My first thought is sdf rigid body's but then if you still want pixel simluations then as soon as a pixel is removed from the sdf the sdf could be completely different.