Ever since the launch of Control I have been extremely curious to figure out how they achieved the hiss effect. We had glimpses of the tech behind it in the VFX Breakdown reel from Remedy that reveal to us some of the techniques.
After the launch of the game I was curious to try this out myself, it lead me down a road of fluid simulations, render targets, data capturing and a whole other slew of rendering areas that I was not familiar with.
Lets get started with Control
From the break down we are told they are using 2D Fluid solvers to achieve the look with added filters for the final touch. From a basic view there’s particles that fly off an enemy after killed, these particles inject themselves into a fluid render target, they themselves are fluid sources as well as velocity sources. This seems simple enough for the particle examples but what about the Geometry versions?
Geometry versions , in case of the moving hiss wall, (the wall with the cubes constantly moving), my guess is there’s a source material applied to this mesh, the source mask is the source for the fluid solver and the geometry velocity from the moving cubes is injected into the fluid target (all a theory , but from the looks of the render doc break down, this seems to be the case). Images below show all the Buffers out of RenderDoc
The fluid source mask is an interesting target, from what I gather, there was an additional mask texture applied to the mesh/material, I would imagine with a sort of tagging system you can have the fluid solver only inject the information from this material.
Lets move on to the Fluid Targets, the next following images show the different fluid channels
Really interesting results and we can get a glimpse of how its all being combined in the end, there was a few other render targets I noticed but nothing that stood out, one was called “Launch Blocker” that was a keyed out silhouette of the character Jessse (the protagonist in Control), my initial guess was that this was a sort of source mask for the fluid, but i don’t believe that's the case (I could be wrong tho!).
Unity Test
Soon after the launch of the game I quickly dove into tests with Unity, at the time I knew there were many examples of 2d fluid solvers on github and I decided to try some of them out, after all you would need the basis of a fluid solver to achieve the effect.
My first test involved just getting a fluid solver on a material with a simple camera facing quad, the fluid would be filled with the mouse as a source point. A little of some shader/material tweaking and we get a cool result.
At this point I wanted to move onto injecting particles as sources but this proved more difficult and I slowly became busy with work and the project became saved to my external harddrive not knowing when it would see the light of day again.
Enter Niagara Grid Solvers
With the release of Unreal 4.25/26, Niagara started incorporating Grid2d and Simulation Stages, this made is available for us to more easily created fluid solvers with grid 2d data collection.
A lot of these examples can be seen by Asher Zhu’s presentation here https://www.youtube.com/watch?v=-cKgZrrBJ2w.
With this in mind I quickly was excited to come back to the Hiss Effect project, only this time in Unreal, with the new Simulation Stages, this made it a bit easier on the artist side to inject different data into these fluid simulations, as well as using niagara’s gas source to inject particle position and data. At the time of me writing this Ive been able to get a few tests of the “Hiss” Effect stood up , in the end itll be interesting to figure out how to properly apply this to the full screen and reproject the depth data onto the fluid sim.
Whats Next?
Look into projecting the depth target onto the fluid (I believe this was mentioned in the breakdown video)
Look into applying the geometry velocity buffer to the fluid as well (look into gbuffer decodes)
Project the result into screenspace and see what happens
This is all an ongoing WIP, if you have an ideas and want to share thoughts , feel free to leave a comment :)
Thank you!
-A