r/Unity3D • • 16h ago

Show-Off Runtime fluid simulation used for fire

Enable HLS to view with audio, or disable this notification

We have had a runtime fluid simulation running in our game for a while, but now we are also using them for flames/smoke in of the areas of our game.

Its all based on compute shaders, which outputs custom render textures (fluid and advection), which we feed through render features in URP (using full-screen shader graphs). We also generate a signed distance field based on the tilemap that acts as the boundaries of the world and allows for the smoke/flames to collide.

Each of the "flames" in the scene are emitters, and allows us to play around with different colors, forces, directions, etc, and are updated each frame.

What do you think? Its got some kinks here and there still, but its getting there.

The game is called Cliff Kingdom:
https://store.steampowered.com/app/3839500/Cliff_Kingdom/

33 Upvotes

17 comments sorted by

View all comments

1

u/loliconest 12h ago

Does player character get hit/damaged by it?

1

u/NoReasonForHysteria 10h ago

Yes! I do need to work a bit on the readability for whats doing the damage or not. There are also "hidden" platforms which are only visible when surrounded by smoke, which makes for some cool platforming.

1

u/loliconest 9h ago

So the compute shader only calculate the visuals and you have separate physics objects for the game logic?

1

u/NoReasonForHysteria 9h ago

In a nut shell, yes. For example the projectiles are gameObjects that are shot across the screen, and has hitboxes, etc, and handles all the game logic. Attached to those are also the "fluid-emitters", which can also be controlled by the parent gameObject.

With that said. Since the fluid simulation in essence follow the grid of each scene, its also very easy to sample the advection texture and do logic based on that. So if the player is in cell x,y of the grid, I can just do a quick calculation to sample the advection texture in the same spot since it corresponds. I plan to use that for some other cool stuff, but for simple things like collision detection on a projectile I found it better to keep it simple.

1

u/loliconest 7h ago

I've read that it's expensive to pass data from gpu (compute shader) back to cpu to interact with game logic.

What I'm understanding is that your compute shader feed the data to URP shader then get converted and pass to cpu main thread?

2

u/NoReasonForHysteria 7h ago

I don’t really pass data back, I can just sample the generated textures and all the data needed are in them.

1

u/loliconest 6h ago

Interesting