Real-time Eulerian fluid simulation on a Macbook Air, using GPU shaders

Sdílet
Vložit
  • čas přidán 25. 12. 2023
  • In order to implement fluid simulation we need to implement conservation of mass, incompressibility, and conservation of momentum. How to do this, using Eulerian cell representation, on GPU shaders?
    Update: I'm dabbling in creating a discord server at / discord Please feel free to join :)
    Update 2: source-code available at github.com/hughperkins/UnityF...
  • Věda a technologie

Komentáře • 112

  • @Kevin-jz9bg
    @Kevin-jz9bg Před měsícem +51

    That was one of the best explanations for advection I've seen online! Especially the pushing bubbles out of a phone screen protector analogy.

    • @rlhugh
      @rlhugh  Před měsícem +3

      Thank you very much! Very much appreciated :)

  • @canter1ter
    @canter1ter Před 5 dny +5

    videos like these are what internet was made for

    • @rlhugh
      @rlhugh  Před 5 dny

      Wow, thank you very much! 🙌

  • @EstanBulLoFre
    @EstanBulLoFre Před 5 dny +4

    I understood none of this yet I was glued to it all the way through

  • @samaltschul4605
    @samaltschul4605 Před 6 měsíci +32

    Hugh, the standard first book on PDE is Walter Strauss's book. If you want to try questions on me I'm happy to help out.

  • @jonsonj5249
    @jonsonj5249 Před 21 dnem +10

    love the experimental feel to how you moved forward itteration by itteration,

  • @anonymouscommentator
    @anonymouscommentator Před 29 dny +10

    loved the video! feels like discovering sebastian lagues yt channel all over again :)

    • @rlhugh
      @rlhugh  Před 29 dny +2

      Wow, that's a very nice thing to say. I feel like I can die happy now. I mean, unfortunately this is my least bad video to date, and you will be disappointed if you watch any of my others, but it's still very nice to hear these words :)

  • @Cmanorange
    @Cmanorange Před 4 měsíci +12

    very good video. i'm glad you showed or mentioned what approaches didn't work

  • @hyperFixationStudios
    @hyperFixationStudios Před 5 měsíci +6

    Great work, I can't wait to see your next simulations!

  • @justinsciullo3342
    @justinsciullo3342 Před měsícem +7

    This is so cool, and you did a great job with the video editing! I hope you make more videos like this!

    • @rlhugh
      @rlhugh  Před měsícem +2

      Thank you! That's very kind to say. Very much appreciated :)

  • @mikhailhumphries
    @mikhailhumphries Před 26 dny +12

    Can't believe I watched entire video about coding and didn't get bored

  • @nolhanmangin5939
    @nolhanmangin5939 Před 9 dny +4

    imagine putting a few ai's in there, make them evolve, adapt to the environment and make them learn how to utilise it to its advantage

    • @rlhugh
      @rlhugh  Před 9 dny +1

      Interesting idea 🤔

  • @santiagobirkenstock
    @santiagobirkenstock Před měsícem +8

    I wish the very best on CZcams, I am so glad I discovered your channel. Keep up the good work !

  • @PAPERSCHOOL
    @PAPERSCHOOL Před 5 měsíci +5

    Really well produced, nice work

  • @omargoodman2999
    @omargoodman2999 Před 13 dny +1

    In a way, this is functionally simulating Quantum Mechanics and illustrating the principle of "Particle/Wave duality". The entire fluid motion can be represented as a vector. But the vector, *itself,* must behave as a particle, moving in response to the overall "equation" of the fluid flow. And that flow, in turn, changes in response to how those velocities keep changing within it. The more "interactions" there are, the more you'd have to "zoom in" and re-calculate based on the rapidly changing velocities. But the fewer the interactions, whether that be due to smooth flow, "low temperatures" (less movement), etc., the more you can just look at the overall average equation for how the vectors evolve.
    So, in keeping with this notion that this is very much like Quantum Mechanics, using the principles of QM would probably help improve the quality of the simulation.
    *1)* Non-Zero Baseline: In QM, particularly Quantum Field Theory, one of the major notions is that everything isn't sitting at a baseline _zero_ state. Rather, there's a certain minimum baseline energy already present, and it's the net _difference_ over *or under* that baseline which is considered. To put it in context of a fluid, since we're discussing fluid dynamics, it's like there's a big ocean of energy already sitting there. How deep that ocean is is a question scientists argue over endlessly, but it's what happens at the surface that is actually important and what they more or less agree on.
    *2)* Constant Activity: There are constant "little ripples" going all over the place. The surface of the ocean isn't still; it's always churning and bubbling and mixing; and as those little micro-waves this motion generates interact with one another, the peaks of the waves amplify one another, the dips amplify one another, but where peak and dip meet they cancel out. And when it churns enough, it gets big enough to be called a true "wave" (a particle like an electron or a quark). You can't really say that an ocean wave has one specific location; it's a "part" of the ocean as a whole. But you could also point at a part of the ocean at any given time and ask, "Is this currently part of a wave?" Maybe yes, maybe no. The bigger and stronger the wave, the more likely you'll be to "catch" it.
    *3)* Quantized: This means that a wave can't be an arbitrary "height" in this ocean (where "height" here is a stand-in term for the "energy" of a particle). It would be as if waves can only be increments of 10 meters in height. Anything between 10 meters below the surface and 10 meters above the surface would effectively register as if it were right at the surface. Functionally, what this is is "statistical rounding". If there were a wave (particle) that could potentially be 17 meters tall according to the vector math, the particle math has no clue what that means. Particle math only deals in increments of 10 meters. So it has to round 17 meters; but it doesn't use formal rounding. Instead, it uses statistical, trigonometric rounding. 17 meters is 0.7 of the way from 10 to 20. I forget the exact formula, but it's 50/50 if it were X.5, but more than a mere 70% chance at X.7 to round up to the higher value (it follows trigonometric values around a unit circle).
    So these aspects could possibly be implemented in the following ways. First, have some non-zero "baseline" flow value. Never have "zero flow". Not zero *actual* flow, anyway. But simulate the actual pertinent _movement_ not based on this "real baseline" but, rather, relative value compared to that baseline. So, for example, if baseline flow has a vector weight of, lets say, 100, your actual fluid movement model *treats* 100 as if it were zero (staying still), and then movement of 105 is going 5 _faster_ than that. Next, have micro-purturbation in the model by allowing that baseline value to "jitter". While baseline flow that's considered "stillness" would still be considered 100, any specific "cell" of fluid would randomly, iteration to iteration, have a value between 98-102. And it can change its value by up to 2 either positive or negative. These will still factor into calculations, so these changes won't "come from nowhere"; if micro-flow is generated, it will pull from surrounding cells. Lastly, when it comes to evaluating how the vectors, themselves move, you can "fudge" the value a bit. Round it based on the statistical rounding I described to let it "zoom out" and use lower resolution, and then do more of a "random step" pattern instead of a complete vector calculation to determine how a vector moves. This way, vectors don't have to consider, "how am I moving based on everything around me" 100 times, they just have to decide, "how likely is it for me to move up, down, left, or right based on forces around me" 100 times.

    • @rlhugh
      @rlhugh  Před 11 dny

      Interesting. Thanks! :)

  • @Theo-iz5cj
    @Theo-iz5cj Před 5 měsíci +1

    Great and inspiring video, thanks a lot!

  • @SpeedyGwen
    @SpeedyGwen Před 28 dny +15

    first thing I thought about when I clicked on this video is about The Powder Toy which is a pixel based particle simulator game which actually has that exact same type of fluid simulation for simulating air in the game

    • @rlhugh
      @rlhugh  Před 28 dny +1

      Interesting! Thank you!

  • @HitAndMissLab
    @HitAndMissLab Před měsícem +1

    Thanks for the beautiful video.

  • @veritas7010
    @veritas7010 Před měsícem +2

    I love this, thank you for makin my day on yt much better!

    • @rlhugh
      @rlhugh  Před měsícem

      Thank you very much!

  • @benjaminlehmann
    @benjaminlehmann Před měsícem +1

    I loved this video! Really inspiring, and I'm sort of amazed that this was running on a macbook air too - great job :D Thanks so much for sharing.

    • @rlhugh
      @rlhugh  Před měsícem

      Thank you very much!

  • @jackquimby1925
    @jackquimby1925 Před 12 dny +1

    This is super cool, keep it up!

  • @antonhengst8667
    @antonhengst8667 Před 12 dny +1

    This guy's gonna love learning about the weak fem form for the constitutive eularian fluid equations

    • @rlhugh
      @rlhugh  Před 12 dny

      Good heads-up. Thanks!

  • @tommycard4569
    @tommycard4569 Před měsícem +2

    educational and entertaining! loved it, thank you

  • @saadahmed688
    @saadahmed688 Před 6 měsíci +2

    Subbing cause I wanna see you simulate the inside of Earth. Great content

  • @CalcWithDec
    @CalcWithDec Před měsícem +1

    Beautiful!

  • @naztar4323
    @naztar4323 Před 25 dny +2

    You could have used MultiGrid for the solver since it land it self to parallelism better

    • @rlhugh
      @rlhugh  Před 25 dny

      Yes. Potentially a topic for a next video :)

  • @jomazu7874
    @jomazu7874 Před 20 dny +2

    i bet this would run much better on a gpu with a cooling system and more than 10 cores (or whatever your model of macbook has)

  • @tahmidchoudhury8946
    @tahmidchoudhury8946 Před 6 měsíci +2

    Got recommended.....now in love

  • @Kyler1Ace
    @Kyler1Ace Před 4 měsíci +1

    Great video

  • @NobodyYouKnow01
    @NobodyYouKnow01 Před 27 dny +2

    No way Euler got named for a fluid dynamics problem. We're supposed to name the problem after the *second* person to solve it!

  • @FromLake
    @FromLake Před 24 dny +1

    Thank you for this video

  • @janerikjakstein
    @janerikjakstein Před 24 dny +2

    Awesome 👍

  • @EmmanuelMessulam
    @EmmanuelMessulam Před 16 dny

    Thanks for the explanations and the sources! please add the links to the description though :D

    • @rlhugh
      @rlhugh  Před 8 dny +1

      Published to github.com/hughperkins/UnityFluidSim-pub

  • @qfurgie
    @qfurgie Před 21 dnem +5

    me: 50 frames per second that’s pretty bad performance
    RL: *”on my MacBook Air”*
    thats CRAZY

    • @D.S69
      @D.S69 Před 20 dny +1

      50 fps is bad?

    • @qfurgie
      @qfurgie Před 19 dny +1

      @@D.S69 for a 480p 2d fluid simulation on a GPU, yes, but I'm used to these videos being done on NVIDIA cards like 3080s with tens of thousands of cores. Having this kind of performance on a MacBook Air (limited power with no active cooling), especially *while recording* is really awesome

  • @sapiosuicide1552
    @sapiosuicide1552 Před měsícem +1

    Cool

  • @iamsushi1056
    @iamsushi1056 Před dnem +2

    Would it be possible to create a more complex velocity map by uploading an image, and only looking at hue and brightness, ignoring saturation? Obviously colors approaching white could be a problem, but you could remedy this by thresholding saturation and then treating anything below the threshold as a non-fluid/wall if the brightness is high enough that it would otherwise have a velocity

    • @rlhugh
      @rlhugh  Před dnem +1

      Good idea! It's open source. PRs welcome :)

  • @tselhamishac5910
    @tselhamishac5910 Před 25 dny +1

    Nice

  • @blitzguitar
    @blitzguitar Před 20 dny +1

    Imagine the kind of simulation you could do with a 4090 over the mac book.

    • @benjitheengi4447
      @benjitheengi4447 Před 14 dny +1

      No no no you dont understand plebian
      Apple Silicon tm is magic and cannot be beaten by mere mortal technology

  • @user-fj9hf4bu9f
    @user-fj9hf4bu9f Před 23 dny +4

    no links to the code?

    • @rlhugh
      @rlhugh  Před 8 dny +4

      Published to github.com/hughperkins/UnityFluidSim-pub

    • @user-fj9hf4bu9f
      @user-fj9hf4bu9f Před 4 dny +3

      @@rlhugh thanks.

  • @netyimeni169
    @netyimeni169 Před 20 dny +1

    Now I have to find someone to explain how to do that in Godot

  • @Tordek
    @Tordek Před měsícem +1

    regarding the parallel part: would it be feasible to work the opposite way? Instead of writing to 4 cells, each cell would instead read from 4 neighbors and update itself.

    • @rlhugh
      @rlhugh  Před 9 dny

      No, because we are writing to the walls of the cells, not the cells themselves. And each wall has two neighbors.

  • @tiniustreider9466
    @tiniustreider9466 Před 11 dny +1

    thanks so much all the other videos about water simulation is either way too complicated or just a blender tutorial

    • @rlhugh
      @rlhugh  Před 11 dny

      Awesome. Thank you very much :) that's very kind to say. I really appreciate your saying that :)

  • @dovos8572
    @dovos8572 Před 22 dny +1

    11:11 that looks like the lines of a magnet.

  • @cashkurtz5780
    @cashkurtz5780 Před 28 dny

    So persistent zero velocity is like a solid object? I wish it were easier to see it against an unmoving background .

    • @rlhugh
      @rlhugh  Před 28 dny

      Yes, that's right. As far as the coloring scheme, definitely open to suggestions. Won't affect this video, since cannot modify published videos. But could be useful for future videos.

  • @incription
    @incription Před 21 dnem +1

    this thumbnail is better

  • @redstoneready697
    @redstoneready697 Před měsícem +1

    do you think this could be used for electromagetics?

    • @rlhugh
      @rlhugh  Před měsícem

      Interesting question!

    • @YaofuZhou
      @YaofuZhou Před měsícem +3

      Depending on what you want. I guess you want to iteratively compute the EM fields?

    • @XGD5layer
      @XGD5layer Před 22 dny

      Some of the simulations definitely looked like simple 2d magnetic fields

  • @christianhelgeson3712

    Could write conflicts also be avoided by just writing to a separate buffer fhan the one you are reading from?

    • @rlhugh
      @rlhugh  Před 9 dny +1

      No, because we are writing to the walls of the cells, not the cells themselves. And every wall has two neighbors, so there would be conflicts.

    • @christianhelgeson3712
      @christianhelgeson3712 Před 9 dny

      @@rlhugh Thank you. How would you write the shader to allow for each pass to be offset correctly. Do you pass a uniform that specifies the offset? And are you still running multiple iterations for each of the four divergence passes?

    • @rlhugh
      @rlhugh  Před 9 dny

      For your first question, yes, that's right. I simply pass in two ints, one for x offset (0 or 1), and one for y offset (0 or 1)

    • @rlhugh
      @rlhugh  Před 9 dny

      As far as your question about 'divergence passes'. we have to re-compute the divergence for each of these sub-passes. The divergence was modified by the previous sub-pass, and we need to take that into account. (if we didn't need to recalculate divergence, we would only need a single pass, no sub-passes).

    • @rlhugh
      @rlhugh  Před 8 dny

      Oh, I misunderstood your second question. So yeah, you do each of the 4 sub passes. Let's call that one pass. then iterate over the pass of 4 sub passes, like 200 times or so

  • @drpwnage23
    @drpwnage23 Před 4 měsíci +1

    This is really cool. Do you have a github repo available for this?

    • @rlhugh
      @rlhugh  Před 4 měsíci +3

      I probably should do that yeah...

    • @rlhugh
      @rlhugh  Před 8 dny +1

      Published to github.com/hughperkins/UnityFluidSim-pub

    • @rlhugh
      @rlhugh  Před 8 dny

      whoops, forgot to set it to 'public'. Fixed. hopefully

  • @josiahjoel7580
    @josiahjoel7580 Před měsícem

    this is so cool, is it possible to upload the source code to a public repo?

    • @rlhugh
      @rlhugh  Před 8 dny

      Published to github.com/hughperkins/UnityFluidSim-pub

  • @kwccoin3115
    @kwccoin3115 Před měsícem

    How do you run these shader ? Can it use under sdl2?

    • @rlhugh
      @rlhugh  Před měsícem

      These are running in Unity, using HLSL.

  • @wokeupina
    @wokeupina Před 29 dny

    wait you need a macbook pro to do pro stuff?? (looks sexy)

    • @rlhugh
      @rlhugh  Před 29 dny

      I'm using a MacBook air m2

  • @footballmint
    @footballmint Před 18 dny

    Very nice video. Now get a beefy graphics card and run at very high resolutions lol.

  • @samwolfe1000
    @samwolfe1000 Před 22 dny

    Which method is cheaper to run?

    • @rlhugh
      @rlhugh  Před 22 dny

      You mean for Lagrangian vs Eulerian? Eulerian is faster/cheaper.

    • @samwolfe1000
      @samwolfe1000 Před 22 dny

      @@rlhugh Sorry for the vagueness, I meant for particle - vs vector based

  • @tomd6410
    @tomd6410 Před měsícem +2

    Love this but if that’s how you say Euler I’ve been saying it wrong all this time 💀💀

    • @rlhugh
      @rlhugh  Před měsícem

      I did research the pronunciation. There are a couple of ways. Before I researched the pronunciation, I was saying "you lurr Ian". But "oiler Ian" appeared to be more common, as far as I could see? How are you thinking if should be pronounced?

    • @tomd6410
      @tomd6410 Před měsícem

      @@rlhugh I’ve been saying youll-lah 😅

    • @rlhugh
      @rlhugh  Před měsícem +1

      @@tomd6410 actuuaaalllyyy seems that it might depend on us vs UK pronunciation, eg see youglish.com/pronounce/eulerian/english/uk

    • @unepintade
      @unepintade Před měsícem +1

      ​@@tomd6410i feel like "name"-ian in English are pronounced very differently from how you pronounce the name so while Euler is pronounced weirdly, eulerian is pronounced how you would expect, like Laplace and Laplacian

    • @landsgevaer
      @landsgevaer Před 23 dny

      Oy-lear-ean, surely...?

  • @Leviathan_22
    @Leviathan_22 Před měsícem +2

    "shaders are fun" consider me an opp

  • @ethos8863
    @ethos8863 Před 22 dny

    rather than updating a bunch of nonadjacent cells why don't you store two buffers, and instead of changing a cell's neighbors, instead calculate how a cell is affected by its neighbors, and write that into the second buffer.

    • @rlhugh
      @rlhugh  Před 20 dny

      Do you mean, in the projection step? Because we aren't updating the cells: we are updating the walls of each cell. And each wall is attached to two cells. There isn't a way of updating one cell without updating its neigbor, because we aren't really updating the cells: we are updating the walls. When we choose 'a cell', what we are doing is updating all 4 walls of that cell. Then, you might say, can we select arbitrary walls? Well, no, because the update of 4 walls around a cell is based on ensuring incompressiblity of the fluid entering and leaving that one cell, but the updates themselves are applied to the walls, not to the cell. There is no way then to update two adjacent cells, because we'd be updating the same wall twice, i.e. the wall in between the two cells. Having a buffer doesn't really change that. Let's imagine we update the walls around cell A, into buffer 2. Now, when we calculate the walls around adjacent cell B, we'll need to read the values from buffer 2, in order to have the up to date value for the shared cell wall. So, it's sequential, not parallel. Not sure to what extent that answers your question?