In this post, I’ll be continuing with my Niagara deep dive and going through the content examples in UE5!

Also! I got promoted from Associate Tech Artist to just Tech Artist! ✨

I found another great Niagara Overview talk from Wyeth Johnson: https://www.youtube.com/watch?v=bX6tdCdOEVA

  • Most of the good stuff is at the end after16:38, going through the new features
Explanations of Attribute Reader, Neighbor Grid 3D, Simulation Stagers, and Grid 2D were helpful

Also found a good game dev beginner math presentation featuring Wyeth Johnson: https://www.youtube.com/watch?v=KrghZBIIsXc

2.1 Static Beams

  • To view the parameters used in an emitter, you must click on the emitter. Otherwise, Niagara defaults to system level parameters only.
Make Niagara ID: A useful looking node in the Spawn Beam module

2.2 Dynamic Beams

NOTE: Keep and eye out for where to modify the transforms in a system and emitter.
For example, this is in world space…

Or is it? What does Absolute Beam End mean exactly? I checked the nodes:

Ok, next question – What is the coordinate space of simulation? How is it different than worldspace?

  • Talked to my coworker, Justen, and came to the conclusion that local space is zeroed out position of the system.
  • Simulation space is module specific which lets you offset simulations from local space. So it’s an additional local space that isn’t tied to the Niagara system.
Was able to modify the end position with an expression
Messing around some more…

Overview on making beams here: https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Niagara/HowTo/BeamEffect/

2.3 Multiple Renderers

  • When using multiple renderers, properties of renderers can be customized using custom bindings

2.4 Location Events

  • Events are CPU Emitter only (as of UE5.1, 8/17/2023)
  • Is there a way to create this effect on the GPU?

2.6 Collision

  • CPU collisions are expensive compared to GPU collisions – use sparingly!
  • Collision generated events are CPU only
  • Stackcontext.position?

A nice Beginner Niagara walkthrough: https://www.youtube.com/watch?v=T9pZTF_xB40


3.1 Static Mesh Sampling

The source for the StaticMeshSampler is exposed and set in editor

3.3 Visibility Tag

  • To assign different meshes to particles in a single mesh renderer, use the mesh array feature
  • The visibility tag is when you want to pick between sprite, mesh, light, or other renderers
  • How visibility tag works: The particle will render through the renderer with an index among the list of renderers that corresponds with the visibility tag number
The capsule shaped UI indicates which namespace the attribute belongs to

3.4 Texture Sampling

  • Texture Sampling is only supported on the GPU (as of 8/21/2023 UE5.1)
  • Rejection Sampling? Kill Particles module doesn’t seem to change anything.

4.1 Play Audio Per Particle

Useful combination of modules to scale glowiness based on forces and velocity of a particle

4.2 Renderer with no Particles

  • When Sprite and Mesh renderers have their source mode set to “Emitter”, the renderer can create a single sprite/mesh driven by emitter scripts. All particles namespace bindings also change to emitter namespace bindings.

4.3 Mesh Orientation vs. Rotational Force

Mesh Orientation: Inexpensive, rotational drag has no effect

Rotational Force: Requires Mass to be set per particle, more expensive and good for a more realistic simulation model

  • Mesh Velocity/Drag: We can give a rotational kick with Rotation Force in Particle Spawn and add drag in Particle Update
  • Rotation Force: Consistent force can be applied with the Rotation Force Module placed in Particle Update
Tip: Mesh has its own Coordinate Space.

Whew, that concludes the Niagara Particles Content Examples!

I feel like I have a general understanding of how Niagara is set up and its capabilities.

Now to go on to the fancier stuff in Niagara Advanced Particles and Niagara Fluids. It’s a big goal for me to understand the content examples in these halls. It’ll be highly beneficial for optimization, especially for VR development.


1.1 Simulation Stage Fill Render Target

  • What is a simulation stage? A simulation stage is a “stack” like Particle Update which you can add to the total stack. It is unique because it can run multiple times in a single frame across all elements in it – like a “For Loop” that runs within the stack. Thus, it is perfect for simulations.
  • Sprite Properties need to be set at the emitter level since our renderer source mode is set to emitter – there are no particles, so no sprite properties can be changed on the particle level.
  • In this context, Exec Index means the iteration source element, i.e. a render target cell, grid 2d cell, etc.
  • In Sprite Renderer: Material Bindings Parameter, assign Render Target –> Texture Object Parameter in Sprite Material

1.2 Advection

This is getting tough, here’s an in depth video from dokipen: https://www.youtube.com/watch?v=PCA5jQwFvug&t=1s

  • Niagara dimensions corresponds with cm’s in the real world
  • Why use the “Stackcontext” namespace instead of “Local” in a simulation stage? Stackcontext remains consistent over the stack, while local is per thread of the simulation stage.
  • Stackcontext: Local to the Stack. Can be written and read from module to module. Persist over frames and stages.
  • Transient: Local to the Stackcontext. Can be written and read from module to module. Does not persist over frames or stages.
  • Still confused over Stackcontext vs. Transient namespace. Will overlook for now.
Asked about it Asher’s TEch ARt Discord and got a great answer from Deathrey! Thank you Deathrey!!!

~~~

Preview the Grid2D attribute
22:53 in the video. (0,0) / the origin is in the top left corner. This graphical API works like that…

💡IMPORTANT: Niagara is a bit outdated in dokipen’s video. In the current 5.1 Niagara you need to set resolution through an additional module.

This is a great tutorial on Grid2D to render target from Chris Zuko where I learned about the set resolution module: https://chriszuko.com/niagara-grid-2d-feels-like-a-superpower-drawing-locations-to-a-render-target-in-unreal-5-1/

I went through this tutorial previously once and understood maybe 50% of what was going on (lol)

Bind the render target attribute to the material texture parameter in renderer bindings
Advection 1:03;02 in the video

The same thing as above in the scratch module using material nodes to explain visually:

Finished going through that video! Whew…took another look through the advection example in the content library and it makes way more sense to me now.

Feel like this is a good place to stop for now.

Onwards and Upwards!

Tech Art Diaries 02

In this post, I’ll be continuing with my Niagara deep dive and going through the content examples in UE5! Also! I got promoted from Associate Tech Artist to just Tech Artist! ✨ I found another great Niagara Overview talk from Wyeth Johnson: https://www.youtube.com/watch?v=bX6tdCdOEVA Most of the good stuff is at the end after16:38, going through…

Continue Reading

Tech Art Diaries 01

It’s August of 2023 now, pretty much one year since I started my job in July as an Associate Technical Artist at Polyarc Games! I am now 24 years old and more knowledgeable about shaders, Blueprints, working on a team, and Unreal Engine than I was a year ago… I’ve got some topics I want…

Continue Reading