The Mill SDGM • Real-Time FX R&D • Testing Volumes
Updated: Jan 22, 2020
In-game volumetric effects are usually rendered from a straight-on view (or using an impostor camera rig) and then played back on a card in the engine. This gives a fairly convincing appearance that there is depth to the volume. Problems arise when you need that volume to interact with the environment. If we were designing for gameplay, we would use Unreal's Niagara Effects tool to accomplish this. Since our camera movement is a known variable, I have some leeway. We can render volumetrics in Houdini, and then export them as cards for unreal engine.
I made a test alembic to see whether or not the interaction was believable. I also imported the camera movement from my previous post. I imported both into Unreal. I also set up two lights so I could see if they would interact with the volume convincingly.
On the Houdini end, there's a handy ROP in the SideFX Labs toolkit (previously the Game Development Toolset) called Texture Sheets. It combines normals, emission, and opacity into a single texture sheet. It even sets up an RGB light rig to render the normal map.
The next step was to create the volume material. I used the setup from Mike Lyndon's texture sheets tutorial. I disconnected the emission since that won't be necessary for tire burn out. I also changed the smoke color to full white for visibility during testing.
I then created a particle system using this material as a base. In the particle emitter, you need to define the number of rows and columns in your texture sheet for proper playback.
I added my particle system in Sequencer and set it to activate on the first frame.
As you can see, the card is clipping through the ground geometry. We need the particle system to act as an overlay. Solving this is a simple fix. Check Disable Depth Test in the translucency settings of the material.
There are still a few issues I need to sort out. I need to find out how to create a mat within the texture sheets ROP so that the sprite sheet appears to be occluded by other objects. I think it's a matter of breaking open the ROP and changing the Force Objects parameter in the Mantra node to include the mat geometry. I'm also having some issues with alignment. This may be due to some camera inconsistency between software. I will try to sort this out in my next test.
Also, I tried Ryan Brucks' Ray-Marching plugin. It's quite a bit easier to use than I had previously thought. It doesn't take the scene lighting environment into account. Lighting is defined separately within the shader, so this won't work for our project.