Shockwave VFX

Mentorship project with Krill Interactive

ART & Gameplay

Shader Shockwave

The following videos show the nodes setup used for the main shockwave shape. It consists of textures with polar coordinates + UV Distortion * SDF Mask.

Polar coordinates setup

Distortion setup

SDF Mask

Curve Atlas


I used a curve atlas so that I could have multiple colours available in one asset, and select between them parametrically in the material. This is beneficial vs. creating a separate texture for every variation, since I don’t need to go into Photoshop to create a new gradient texture every time. This way it’s more procedural and artist-friendly.



6-Point Lighting


This method allows for more volumetric smoke, even though it is still a sprite. Instead of using 6 actual lights, I used a channel-packed mask representing the six directions (left, right, up, down, into, outo), previously rendered in Houdini with the actual 6-light setup.

Shader 6-Point Lighting

Niagara Systems

Optimization

Niagara System, CPD & NDC

For optimizing the Niagara System I ended up trying two different methods: Spawn Groups and Visibility Tags. Both have the same objective: to reduce the number of emitters. Without this approach, I would have used 6 different emitters. As you can see from the video above, I used 4. “Base Alpha” + “Circle Glow” + “Shockwave” were all spawned from the same emitter. This improves performance, because each emitter carries a CPU cost.

CPD


Custom Primitive Data was implemented through a single Blueprint and a simple shader, allowing the three cubes to share one material while still showing different colours. When the player overlaps a cube, its colour index is passed through the Blueprint and used to drive the NS colour. The setup consists of one parent Blueprint with three child Blueprints. This reduces the number of draw calls from three to one, while the main benefit is improved workflow and modularity.

NDC

Niagara Data Channels allow data to be shared between Blueprints and Niagara without spawning a new Niagara System for every interaction. In this setup, the Blueprint sends the impact position and hit normal to the NDC, which stores the data and makes it available to the Niagara System. Niagara then reads this information and spawns the corresponding particles at the correct location and normal. This approach reduces the need to repeatedly spawn Niagara actors, making the system more optimized since it tops the amount of calls it makes (see videos below for comparison)


The practical optimization results of NDC: