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

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 ธ.ค. 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...
  • วิทยาศาสตร์และเทคโนโลยี

ความคิดเห็น • 112

  • @Kevin-jz9bg
    @Kevin-jz9bg 29 วันที่ผ่านมา +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  29 วันที่ผ่านมา +3

      Thank you very much! Very much appreciated :)

  • @canter1ter
    @canter1ter 4 วันที่ผ่านมา +5

    videos like these are what internet was made for

    • @rlhugh
      @rlhugh  4 วันที่ผ่านมา

      Wow, thank you very much! 🙌

  • @EstanBulLoFre
    @EstanBulLoFre 4 วันที่ผ่านมา +4

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

    • @rlhugh
      @rlhugh  4 วันที่ผ่านมา

      Haha, nice :)

  • @samaltschul4605
    @samaltschul4605 6 หลายเดือนก่อน +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 21 วันที่ผ่านมา +10

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

  • @anonymouscommentator
    @anonymouscommentator 29 วันที่ผ่านมา +10

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

    • @rlhugh
      @rlhugh  29 วันที่ผ่านมา +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 4 หลายเดือนก่อน +12

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

  • @hyperFixationStudios
    @hyperFixationStudios 5 หลายเดือนก่อน +6

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

  • @nolhanmangin5939
    @nolhanmangin5939 9 วันที่ผ่านมา +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  9 วันที่ผ่านมา +1

      Interesting idea 🤔

  • @justinsciullo3342
    @justinsciullo3342 หลายเดือนก่อน +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  หลายเดือนก่อน +2

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

  • @mikhailhumphries
    @mikhailhumphries 26 วันที่ผ่านมา +12

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

  • @PAPERSCHOOL
    @PAPERSCHOOL 5 หลายเดือนก่อน +5

    Really well produced, nice work

  • @santiagobirkenstock
    @santiagobirkenstock หลายเดือนก่อน +8

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

  • @omargoodman2999
    @omargoodman2999 13 วันที่ผ่านมา +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  10 วันที่ผ่านมา

      Interesting. Thanks! :)

  • @Theo-iz5cj
    @Theo-iz5cj 5 หลายเดือนก่อน +1

    Great and inspiring video, thanks a lot!

  • @SpeedyGwen
    @SpeedyGwen 27 วันที่ผ่านมา +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  27 วันที่ผ่านมา +1

      Interesting! Thank you!

  • @HitAndMissLab
    @HitAndMissLab หลายเดือนก่อน +1

    Thanks for the beautiful video.

  • @veritas7010
    @veritas7010 หลายเดือนก่อน +2

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

    • @rlhugh
      @rlhugh  หลายเดือนก่อน

      Thank you very much!

  • @benjaminlehmann
    @benjaminlehmann หลายเดือนก่อน +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  หลายเดือนก่อน

      Thank you very much!

  • @jackquimby1925
    @jackquimby1925 12 วันที่ผ่านมา +1

    This is super cool, keep it up!

    • @rlhugh
      @rlhugh  11 วันที่ผ่านมา

      Thank you!

  • @antonhengst8667
    @antonhengst8667 12 วันที่ผ่านมา +1

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

    • @rlhugh
      @rlhugh  12 วันที่ผ่านมา

      Good heads-up. Thanks!

  • @tommycard4569
    @tommycard4569 หลายเดือนก่อน +2

    educational and entertaining! loved it, thank you

    • @rlhugh
      @rlhugh  หลายเดือนก่อน

      Thank you!

  • @saadahmed688
    @saadahmed688 6 หลายเดือนก่อน +2

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

  • @CalcWithDec
    @CalcWithDec หลายเดือนก่อน +1

    Beautiful!

  • @naztar4323
    @naztar4323 25 วันที่ผ่านมา +2

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

    • @rlhugh
      @rlhugh  24 วันที่ผ่านมา

      Yes. Potentially a topic for a next video :)

  • @jomazu7874
    @jomazu7874 20 วันที่ผ่านมา +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 6 หลายเดือนก่อน +2

    Got recommended.....now in love

  • @Kyler1Ace
    @Kyler1Ace 4 หลายเดือนก่อน +1

    Great video

  • @NobodyYouKnow01
    @NobodyYouKnow01 27 วันที่ผ่านมา +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 23 วันที่ผ่านมา +1

    Thank you for this video

    • @rlhugh
      @rlhugh  23 วันที่ผ่านมา +1

      Thank you!

  • @janerikjakstein
    @janerikjakstein 24 วันที่ผ่านมา +2

    Awesome 👍

    • @rlhugh
      @rlhugh  24 วันที่ผ่านมา

      Thank you!

  • @EmmanuelMessulam
    @EmmanuelMessulam 16 วันที่ผ่านมา

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

    • @rlhugh
      @rlhugh  8 วันที่ผ่านมา +1

      Published to github.com/hughperkins/UnityFluidSim-pub

  • @qfurgie
    @qfurgie 20 วันที่ผ่านมา +5

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

    • @D.S69
      @D.S69 19 วันที่ผ่านมา +1

      50 fps is bad?

    • @qfurgie
      @qfurgie 19 วันที่ผ่านมา +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 หลายเดือนก่อน +1

    Cool

  • @iamsushi1056
    @iamsushi1056 วันที่ผ่านมา +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  18 ชั่วโมงที่ผ่านมา +1

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

  • @tselhamishac5910
    @tselhamishac5910 24 วันที่ผ่านมา +1

    Nice

    • @rlhugh
      @rlhugh  24 วันที่ผ่านมา

      Thank you!

  • @blitzguitar
    @blitzguitar 19 วันที่ผ่านมา +1

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

    • @benjitheengi4447
      @benjitheengi4447 13 วันที่ผ่านมา +1

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

  • @netyimeni169
    @netyimeni169 19 วันที่ผ่านมา +1

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

  • @user-fj9hf4bu9f
    @user-fj9hf4bu9f 23 วันที่ผ่านมา +4

    no links to the code?

    • @rlhugh
      @rlhugh  8 วันที่ผ่านมา +4

      Published to github.com/hughperkins/UnityFluidSim-pub

    • @user-fj9hf4bu9f
      @user-fj9hf4bu9f 3 วันที่ผ่านมา +3

      @@rlhugh thanks.

  • @tiniustreider9466
    @tiniustreider9466 11 วันที่ผ่านมา +1

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

    • @rlhugh
      @rlhugh  11 วันที่ผ่านมา

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

  • @Tordek
    @Tordek หลายเดือนก่อน +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  8 วันที่ผ่านมา

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

  • @dovos8572
    @dovos8572 22 วันที่ผ่านมา +1

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

  • @cashkurtz5780
    @cashkurtz5780 28 วันที่ผ่านมา

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

    • @rlhugh
      @rlhugh  28 วันที่ผ่านมา

      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 20 วันที่ผ่านมา +1

    this thumbnail is better

  • @redstoneready697
    @redstoneready697 หลายเดือนก่อน +1

    do you think this could be used for electromagetics?

    • @rlhugh
      @rlhugh  หลายเดือนก่อน

      Interesting question!

    • @YaofuZhou
      @YaofuZhou หลายเดือนก่อน +3

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

    • @XGD5layer
      @XGD5layer 21 วันที่ผ่านมา

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

  • @christianhelgeson3712
    @christianhelgeson3712 8 วันที่ผ่านมา

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

    • @rlhugh
      @rlhugh  8 วันที่ผ่านมา +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 8 วันที่ผ่านมา

      @@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  8 วันที่ผ่านมา

      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  8 วันที่ผ่านมา

      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  8 วันที่ผ่านมา

      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 4 หลายเดือนก่อน +1

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

    • @rlhugh
      @rlhugh  4 หลายเดือนก่อน +3

      I probably should do that yeah...

    • @rlhugh
      @rlhugh  8 วันที่ผ่านมา +1

      Published to github.com/hughperkins/UnityFluidSim-pub

    • @rlhugh
      @rlhugh  8 วันที่ผ่านมา

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

  • @josiahjoel7580
    @josiahjoel7580 หลายเดือนก่อน

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

    • @rlhugh
      @rlhugh  8 วันที่ผ่านมา

      Published to github.com/hughperkins/UnityFluidSim-pub

  • @kwccoin3115
    @kwccoin3115 หลายเดือนก่อน

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

    • @rlhugh
      @rlhugh  หลายเดือนก่อน

      These are running in Unity, using HLSL.

  • @wokeupina
    @wokeupina 29 วันที่ผ่านมา

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

    • @rlhugh
      @rlhugh  29 วันที่ผ่านมา

      I'm using a MacBook air m2

  • @footballmint
    @footballmint 17 วันที่ผ่านมา

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

  • @samwolfe1000
    @samwolfe1000 22 วันที่ผ่านมา

    Which method is cheaper to run?

    • @rlhugh
      @rlhugh  22 วันที่ผ่านมา

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

    • @samwolfe1000
      @samwolfe1000 21 วันที่ผ่านมา

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

  • @tomd6410
    @tomd6410 หลายเดือนก่อน +2

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

    • @rlhugh
      @rlhugh  หลายเดือนก่อน

      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 หลายเดือนก่อน

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

    • @rlhugh
      @rlhugh  หลายเดือนก่อน +1

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

    • @unepintade
      @unepintade หลายเดือนก่อน +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 23 วันที่ผ่านมา

      Oy-lear-ean, surely...?

  • @Leviathan_22
    @Leviathan_22 หลายเดือนก่อน +2

    "shaders are fun" consider me an opp

    • @rlhugh
      @rlhugh  หลายเดือนก่อน

      Haha :)

  • @ethos8863
    @ethos8863 22 วันที่ผ่านมา

    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  20 วันที่ผ่านมา

      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?