Creating Particle Systems and Magic VFX for Games
We develop magical effects for games—from fireballs to portals. The difference between "acceptable" and "excellent" comes down to tool understanding: VFX Graph on GPU delivers millions of particles, force simulation, and collision; Particle System (Shuriken) is CPU-based, easier to set up, and more reliable on mobile. Choosing the right tool is the first architectural decision. In our practice, wrong choices have caused a 20% FPS drop on mid-range devices. Let's explore how to avoid such mistakes.
When VFX Graph Is Justified and When Particle System Is Better
VFX Graph is mandatory when you need more than 10,000 simultaneous particles, GPU physics (collision with SDF, vector field forces), or smooth animation from a sprite sheet with subframe interpolation. For fireballs with thousands of sparks or portals with turbulent particle flow—use VFX Graph.
Particle System suffices for mobile platforms (VFX Graph requires compute shader support, which not all mobile GPUs have), low particle counts (a few hundred), or simple integration with Animator via ParticleSystem.Play() in an animation event.
Mixing both is standard. A typical spell architecture: VFX Graph for the main effect (fire stream, spark cloud), Particle System for secondary details (smoke, small glowing dots around it), and a custom shader on a mesh for the aura and distortion.
Why a Layered Structure Is Key to Realistic Magic Effects
A convincing magic effect consists of multiple visual layers, each solving a specific task:
Core – the effect's core.
Dense, bright center. Usually an emissive shader mesh or a billboard sprite with additive blending. High opacity, minimal movement. It gives the viewer a focal point.
Mid – main volume.
The bulk of particles—fire, energy, plasma. This is what most people consider "the effect itself." Here we use VFX Graph with Turbulence Force, Vortex Force, or custom Vector Field. Particles use a Lit shader to receive lighting from the effect itself (via Point Light Output node in VFX Graph).
Edge – fringes and trailing.
Small particles moving away from the main volume. Alpha fade to zero over lifetime. Additive blending—they "glow" over everything else.
Secondary – details.
Sparks, bubbles, runic symbols, leaves. They create a sense of complexity and uniqueness. Often a separate Particle System with low emission rate.
Distortion – space bending.
Full-screen distortion mask around the effect via Distortion Renderer Feature in URP or built-in Distortion pass in HDRP. It signals to the brain: "something unusual is happening with space here."
Point Light Output and Dynamic Lighting from Effects
VFX Graph in Unity (LTS version) includes a Point Light Output block that lets particles emit light. This changes everything: the environment around the spell lights up in real-time, shadows jump, walls flicker.
Light Output configuration: Intensity should be moderate (0.5–2.0 for most effects); otherwise, bloom will burn out everything. Range – from 1 to 5 units. The number of active light instances is limited by the URP Pipeline Asset setting (Maximum Additional Lights per Object). Exceeding the limit silently ignores extra lights without warning.
To save resources: real Point Light is needed only for the brightest particles closest to the camera. The rest emulate light via emissive shader + Bloom. In VFX Graph, this is done with Set Active on Light Output conditioned by Lifetime or Distance To Camera.
Fireball Spell: A Concrete Example
Project: action RPG, Unity LTS, URP. Task: fireball—a projectile flying from the hand to the target, exploding on impact.
Structure: two VFX Graph assets (travel phase and explosion phase) + two Particle Systems (trailing sparks and smoke) + a custom shader on a sphere mesh for the core glow.
Travel phase VFX Graph: Sphere Spawner with radius = 0.2, Turbulence Force with low intensity, color gradient over lifetime (yellow → orange → dark red), Size over Lifetime – decreasing toward the end of particle life. Particle speed – opposite to the fireball's direction (trail drags behind).
Explosion phase: Burst emit 2000 particles in one frame, Sphere initial velocity with high radial factor, Collision with scene SDF – particles bounce off surfaces. Point Light Output with intensity 5.0 for the first 0.3 seconds, then Lerp to 0. Screen-space shockwave through a custom distortion pass, activated via Signal from VFX Graph through C# event binding.
| Effect Type |
Timeline |
| Simple spell (1–2 layers, no dynamic light) |
2–3 days |
| Full magic effect (4–5 layers, light) |
5–8 days |
| Spell system (5–10 unique VFX) |
2–4 weeks |
| Explosion or ambient VFX for environment |
3–6 days |
What's Included in the Work
- VFX source files (Graph/System) with comments
- Custom shaders (if required)
- Configuration of lifetime, emission, colors
- Optimization for the target platform (mobile/PC/console)
- Documentation for customization
- Integration into the project (Unity Package)
- Performance guarantee (FPS budget)
Why Choose Us
Our team has extensive experience in game development. We have delivered 40+ VFX systems for games across genres—from mobile casual to PC/RPG. We use an up-to-date stack: Unity VFX Graph, URP/HDRP, custom shaders. We'll assess your project in one day—contact us to discuss details. Order custom VFX development and receive a ready-to-integrate result with support.
How to distinguish a working shader from a failed one?
A programmer adds water to a scene and gets a blue rectangle. The Asset Store delivers an outdated asset with artifacts on mobile. Shader development is not just applying a texture—it’s a complex engineering task: you need to understand the depth buffer, sample normals in multiple layers, and organize foam at intersections with geometry. Without this, the shader either doesn’t work or kills FPS.
Our team has been engineering shaders and VFX for over five years—during this time, we’ve worked on dozens of projects from indie to AAA. Once, a client brought a water scene from the Asset Store: on a mobile device, it ran at 12 FPS due to missing LOD and incorrect batching. We rewrote the shader for URP and achieved 60 FPS while preserving the visuals.
URP vs HDRP: What should you choose for your project?
The choice of Render Pipeline is fixed at the start—shaders for HDRP do not work in URP and vice versa. Evaluate the trade-offs based on the table:
| Parameter |
URP |
HDRP |
| Target platforms |
Mobile, PC, consoles |
PC, consoles (High-end) |
| Performance |
Low overhead, up to 40% faster on mobile |
High load, photorealistic |
| Screen Space Reflections |
Limited (since version 14) |
Full with settings |
| Volumetric Fog |
Via custom |
Built-in system |
| Water System |
Absent |
Built-in |
| ShaderGraph nodes |
Basic set |
Extended (Diffusion Profile, Eye) |
Conclusion: URP provides up to +40% FPS on mobile devices compared to HDRP. For a mobile RPG, we chose URP—on an iPhone 8, we got stable 60 FPS without quality loss. HDRP is justified on PC/consoles where photorealism and the built-in Water System are needed.
How to develop shaders in ShaderGraph: from water to vegetation
ShaderGraph is a node-based editor without HLSL, but understanding "under the hood" is essential. Let’s break down a water shader—it includes several techniques.
Normal motion. Two layers of normal maps sampled at different speeds and directions:
Time → Multiply (speed1) → Add → Sample Texture 2D (normalMap)
Time → Multiply (speed2) → Add → Sample Texture 2D (normalMap)
→ Normal Blend → Normal (fragment shader)
Two opposing directional layers create the effect of running waves without tiling periodicity. Consumption: 2 texture samples, which fits within the budget of 40 draw calls for a water surface.
Depth and foam. Using the Scene Depth node (opaque texture must be enabled in URP/HDRP), we get the difference between the scene depth and the water fragment’s position. Shallow depth (intersection with the shore) → foam via Step/Smoothstep. Deep depth → more saturated blue, higher opacity. Foam adds 1-2 ms on GPU but provides a realistic shoreline.
Refraction. Scene Color + UV offset by normal map—the bottom "swims". Water is rendered in the Transparent queue, after all opaque geometry. Be sure to enable Opaque Texture in URP settings, otherwise refraction won’t work.
Fresnel and reflections. Fresnel Effect node—near the camera normal, the surface is more transparent; at sharp angles, it reflects. Physically correct for dielectrics. A cubemap or Reflection Probe is added on top of the Fresnel mask. On mobile platforms, replace Reflection Probe with a low-resolution cubemap (128x128)—saving 1-2 ms.
Vegetation shader. Animating bushes and grass without physics simulation—via vertex shader. In ShaderGraph: take vertex XZ coordinates as phase shift, Time → Sine with different phases, multiply by Vertex Color channel R (white = swaying, black = fixed to ground). Result: grass sways in waves, base remains fixed. For "wind when the player runs," add a CPU parameter _PlayerPosition. Such a shader handles 100,000 vertices in 0.3 ms on an iPhone 11.
The original asset used 4 normal map layers and dynamic cubemap reflections—on mobile, it delivered 12 FPS. After rewriting for URP with two layers, simplified foam, and baked reflections, we achieved 60 FPS. Development time saved: 1 day instead of 3 days for asset adaptation.
VFX Graph: How to manage millions of particles on GPU
VFX Graph runs entirely on GPU via Compute Shaders. Unlike Particle System (Shuriken), which works on CPU, here you can manage millions of particles without CPU load. Example: an explosion with shrapnel (200 particles) on GPU takes 0.05 ms, while a CPU Particle System of the same complexity takes 0.8 ms.
The graph is divided into contexts: Spawn (burst, constant rate, event trigger), Initialize (initial attributes), Update (gravity, turbulence, collisions), Output (Quad, Mesh, Lit/Unlit, Distortion).
Example: explosion with shrapnel
Spawn: Single Burst (count: 200)
↓
Initialize:
Position: Sphere Volume (radius: 0.1)
Velocity: Spherical * Random(5, 15)
Size: Random(0.05, 0.3)
Lifetime: Random(0.5, 2.0)
Color: Gradient by lifetime (white → orange → gray)
↓
Update:
Gravity (force: -9.8)
Drag (coefficient: 0.2)
Turbulence (intensity: 2.0)
Collision (Scene SDF or Depth Buffer)
↓
Output Quad (Unlit):
Texture: spark
Blend Mode: Additive
Turbulence uses Noise Field—3D noise, particles deviate organically. Flipbook animations in the Output context—sprite animation for each particle.
How to optimize VFX for mobile platforms?
For mobile devices, reduce particle count to 50 and disable Collision—saving 3 ms. Use GPU instancing with VFX Graph’s automatic instancing: the same explosion effect on iPhone 11 runs at 0.02 ms per burst, which is 2.5x faster than a CPU-bound setup. Also enable particle LOD via Quality Levels in VFX Graph: lower particle counts on medium-spec devices while keeping visual fidelity on high-end.
Why does post-processing require platform-specific tuning?
Post-processing—effects applied to the final image after main rendering. In Unity via the Volume system (Local/Global Volume). Typical stack for an action project:
| Effect |
Purpose |
Notes |
| Bloom |
Glow of bright sources |
Threshold 0.8, intensity 0.5—saves 1 ms |
| Tonemapping |
ACES filmic for realism, Neutral for stylization |
Standard for realistic projects |
| Color Adjustments |
Contrast +10%, saturation +5% |
Tweak to mood |
| Vignette |
Darken edges |
Intensity 0.3—focuses on center |
| Motion Blur |
Blur along motion vector |
Disable on mobile—saves 2 ms GPU |
| Depth of Field |
Bokeh |
Careful in VR—breaks depth perception |
| Screen Space Ambient Occlusion |
SSAO / HBAO |
Darkens geometry corners, +1.5 ms |
For mobile platforms, we disable Motion Blur and SSAO, reduce Bloom to 2-3 passes—final post-processing budget of 3-4 ms. On PC/HDRP, the stack can take 8-10 ms, but this is compensated by GPU power.
What deliverables do you get?
- Custom shader development in ShaderGraph (URP/HDRP): water, vegetation, character effects, holograms, dissolve.
- VFX Graph effects: explosions, fire, smoke, magic, environment. Maximum performance—up to 2 million particles on GPU at 60 FPS.
- Setting up and optimizing Particle System (Shuriken) for mobile platforms: replacing with GPU instancing reduces draw calls by 70%.
- Building a Post-Processing stack aligned with the project’s visual style, with render time measurement.
- Porting shaders between URP and HDRP when changing pipeline: average time 0.5-1 day per shader.
- Optimizing VFX for the target platform: GPU instancing, particle LOD, culling.
Deliverables include shader and VFX graph source files, setup documentation, team training (1 hour consultation), and support for one month after delivery. We’ll evaluate your project in one business day—contact us. Get a consultation for your project—we’ll find the optimal solution and provide timelines.
What is our experience and guarantees?
Over 5 years in game development, 50+ projects (mobile, PC, consoles). We guarantee that the shader will work on the target platform at the stated FPS—if not, we rework it for free. Example: for one indie studio, we rewrote all shaders for URP—FPS on iPhone 8 increased from 25 to 60, and the render time budget decreased by 40%. We use the latest stable versions of Unity (LTS) and Unreal Engine 5, working with Vulkan, Metal, DirectX 12.
Comparison: a ready-made asset from the Asset Store often requires rework (compatibility, performance)—custom shader development is 2-3 times faster in terms of time than adapting someone else’s code. And a shader written from scratch for your tasks gives you 100% control over performance and visuals. Budget savings on one project can reach 30% due to the absence of unnecessary code.
What are the work stages?
- Analysis: examine the scene, target platforms, FPS requirements. Capture visual references.
- Prototyping: create shader/VFX graph, test on reference device.
- Integration: embed into the project, adjust parameters, optimize draw calls and batching.
- QA: test on all target platforms (Android, iOS, PC, consoles), fix artifacts.
- Deployment and handover: deliver source files, documentation, conduct training. Support for 1 month.
Timeline: 2 to 10 business days depending on complexity. Cost is calculated individually—write to us, we’ll evaluate your project. Order shader development—get a ready result with performance guarantee.