Changelog
2019/10/08 - Initial release
2019/10/09 - fixed some incorrect labels in the Emitter section

This guide focuses on those Skyrim particle system values which are important to complex particle lights, however it can also be used as general particle system guide. Initially it will mostly allow you to edit the values of already set-up particle systems since adding/removing nodes can be a bit tricky, I may in the future add a guide which focuses on those details.

I apologize for the somewhat rambling style however at the moment I just don't have the time to be a literary master. If you believe any of the information below to be incorrect and you have data to prove it let me know right away. If anything is not clear or not well explained ask and I will clarify. Likely I will rewrite/expand the guide over time.

Credits

I learned a lot about the basics of Skyrim particle systems from this guide although it's for Oblivion and some things have changed. I do recommend reading it first before proceeding with this text. However what all these settings do in practice I've learned through many hours of experimentation. There are many small things and quirks not mentioned anywhere. So the goal of this guide is to shed light on the practical application of Skyrim particles in light of their use as ENB light sources.
Also special thanks to mindflux, Rudy and anybody else at the ENB forums who has been able to help me with this arcana (and Boris of course).

* * *

This guide requires some basic understanding of NifSkope and editing nif files, as well as how RGBA colors work. It also helps to know some basic terms like interpolation, boolean variables etc.

There are two types of ENB particle light effects. One is called Complex Particle Lights and the other Complex Fire Lights but in fact both work with particles. Now we do not want ALL particles to emit light, so ENB needs some way to figure out what particles should emit light. Here Boris came up with these rules (he's looking at the other end of the pipeline but below are the rules as seen from our point of view, which is the nif files):

"Fire" particles are those which have subtextures, since this is how fire is animated (essentially these particles use textures which contain several frames of a flame animation which is "played" on the particle during its lifetime). This of course means that any particles which use this type of animation will emit light even if they aren't really fire particles.

"Normal" light particles have no subtextures. However since this encompases MANY particle effects, only those without "greyscale texture" settings emit light - since these are typically used for glowing effects which you'd expect to emit light.

All other particles do NOT emit light. Also there are some shader flags which prevent a particle from emitting light.

I have posted here all the details I know

Now there is one very important fact which allows us to create particle systems ONLY dedicated to light emission: meaning particles which are INVISIBLE on the screen but emitting light. This fact is that a particle will emit ENB light even if its texture is set to full transparency, if the rest of the conditions are met. This allows us to design a finely tuned ENB light source without messing with the visual appearance of existing particles.

Due to reasons explained in my mod's description I have decided that it is best to disable Complex Fire Lights and do all ENB particle lighting using Complex Particle Lights.

So these are the rules our particles must follow to emit this type of light:

- first and foremost Alpha Blending must be set to additive (4109)
- particle system must be NiPSysParticleSystem; BSStripParticleSystem particles do NOT emit light.
- NipSysData - Has Texture Indices set to NO
- no greyscale texture
- BSEffectShaderProperty - greyscale flags must be disabled and no greyscale texture present
-- Emissive multiple must be more than 0
-- Emissive color must be more than 0-0-0-0
- Initial Size in Emitter must be above a certain size to get sufficient light (depending on how far your emitting object is from the objects you want to illuminate).
- color values in SimpleColorModifier must be more than 0-0-0-0
We also want a texture file with full transparency so that there's no visible particle rendered.


Skyrim Particle Systems and what the various settings do in practice



This is how a NiParticleSystem node tree looks like. It may have fewer or more modifiers than what you see on the image.

Some notes on what the various nodes do:

ParticleSystem

You want to not touch pretty much anything here.
Translation is the position of the particle system relative to the parent. Typically there is an Emitter Object which is another node in the node tree, in which case the values here are completely irrelevant and the Emitter Object is the actual particle source.
Scale is best left to 1.0 because in my experience changing this may affect much more than particle size and may produce some very weird results.
WorldSpace means whether your particles are born in global world space or local space. If this is set to yes then particles with 0 speed and no other modifiers controlling movement (like drag or gravity modifiers) will stay at the location where they are born. Set to no if you want your light particles to stick with the parent object.


EmitterController

There are two types of this modifier. The MultiTargetEmitterCtlr is used in mps files (which are dedicated particle system nif files – see more in my dedicated tutorial on "Adding ENB Light sources..."). Plain EmitterControllers are used in particle systems embedded in all other nif files.
Frequency here should be left at 1. This means how often the visual result of the particle system is updated on the screen. Values lower than 1 can produce interesting results (like your particle animation being sort of smoothed over) but I do not recommend that unless there's something very specific you are trying to achieve.
Phase – I have no good explanation on the practical in-game effect of this value, however based on what the term means in computer animation I think it's supposed to shift the state of the particle animation at a given point of time. I leave this at 0.
Start Time – when the particle system starts generating particles (in seconds). Best left at 0.
Stop Time – when the particle system stops generating particles. Typically the controller is set to a loop so it'll restart right away, however this means that you have to tune this value together with your particle birth rate and life span, otherwise you may get some unwanted jittering at the point when the controller restarts. If your effect animation lasts 5 seconds you can just set the controller to last a bit more to prevent this, but if the effect is continuous you need to consider this value.

Example: particle birth rate of 5, life span of 0.4 would mean you have a new particle born every 0.2s and lasting 0.4s. Now set the emitter controller stop time at 0.5s. What happens is this: particle 1 born at 0.2s, particle 2 born at 0.4s. Controller restarts at 0.5s, so your next particle is born not at 0.6s but at 0.7s (0.5 + 0.2). So your accumulated particle brightness (say 1 is the brightness value of 1 particle) looks like this over the timeline: 0.0s - 0.2s: 0; 0.2s - 0.4s: 1; 0.4s-0.6s: 2; 0.6s-0.7s: 1; 0.7-0.8s: 2; 0.8s-0.9s: 1; 0.9s-1.1s: 2; 1.1s-1.2s: 0; 1.2s-1.4s: 1; and so on. You can see that the sequence is broken and so your light will flicker in a broken way. So, unless this is your explicit intention, you should have a value here which keeps the sequence smooth.

Interpolator – this links to a NiFloatInterpolator, and the value in it is your particle birth rate per second.
If it goes to a NiBlendFloatInterpolator, this means there is an animation controller which is something beyond the scope of this guide at this point.
Visibility Interpolator - this links to a NiBoolInterpolator (Bool values can be only yes or no, equal in this case to 1 and 0) which has a NiBoolData node with 2 keys. The first key should have Time set to 0 and Value set to 1. The second key should have Time set to the same value as Stop Time and Value set to 0. This means the particles generated by this particle system are visible from Time 0 until Time (Stop Time).

Particle birth rate * particle lifespan = number of particles alive on the screen at the same time. This is your primary performance concern, so try to achieve your desired effect with the lowest possible particle count.


SysData

You do not really care about this other than not touching pretty much anything here. On a particle system purpose-built as a complex particle light source you best leave all values the same as shown on the screenshot.
BS Max Vertices is something like a particle count limit, so if it's 5 and your particle count is 6 your light will skip particles and look broken. This value also seems to be shared across all particle systems in one nif file so if one of them is too low it will limit all the particles generated by that nif file. This is just my experience.
Aspect Ratio is best left to 1 or your light will look weird from different angles.


EffectShaderProperty

Shader Flags should be as shown on the image. Any other flags enabled may interfere with ENB particle light functionality and are not needed for it anyway (again we're talking about a particle system purpose built to ONLY function as a light source).
Source Texture will always be your blank texture file.
Emissive Color will tint your light across the board, however I personally leave it pure white and control color from SimpleColorModifier (read below).
Emissive Multiple multiplies the RGB values of Emissive Color, so color set to 0.5, 0.5, 0.5 and multiple 2.0 is the same as color set to 1.0, 1.0, 1.0 and multiple 1.0. This is the easiest place to adjust your light's intensity. I prefer to leave it at 1 and do all my tuning in SimpleColorModifier since it gives you much finer control, however if you need a LOT of light intensity this is where you get it.
I do not have a good grasp on what the different Falloff values do in practice. If they do what I think they should do (meaning they control the particle visibility based on viewing angle), then you do not want any Falloff on a particle light.


AlphaProperty

The Flags value must be set to 4109 (this means additive alpha blending) in order for ENB to recognize the particle as light emitting. The Threshold value here I believe is safe to ignore (I believe it is only used when alpha testing is enabled).


Emitter

Your particle source; there are several types of emitters, I mostly use sphere emitter for point light type sources. A sphere emitter with a size of 1 means your particles will be born in a spherical volume with a diameter of 1. Box and cylinder are equally self-explanatory.
Increasing the size of the emitter in practice results in the shadow moving around as if the flame is moving around. Smaller radius - more subtle shadow movement, for bigger fires you want pretty big emitters.

Mesh emitters are interesting because they give you more power by allowing particles to be emitted from the faces of the mesh and go in different directions along the normals of these faces. This allows for a variety of effects (such as explosions). Fireball explosion mesh or flame cloak mesh show examples of how this emitter is used. These are a bit more advanced so I'd say beyond the scope of this guide.

The Emitter Object I believe may be left blank, then the particle source location is the parent particle system node location. Otherwise the source is the selected node.

The settings to watch for are:
Speed & Speed Variation: this is mostly relevant if you're making an explosion or an orbiting light effect, for these you need gravity & bomb modifiers. I won't be looking at those at this time.
Declination and Planar Angle values are also only relevant if the particle is moving, then they affect the movement direction.
Initial Color: this does nothing, leave it at pure white.
Initial Radius: this is the particle size if all other scales are set to 1.0.
Radius Variation: each particle will have a random size from "initial size - size var" to "initial size + size var" (the Oblivion particle guide says something else but I have tested this in the game). Set to 0 to have all particles be of of the same size. Setting it higher than 0 will add some flickering to your light. The magnitude of the flickering will depend on how big is the variance as % of the initial size. Values above 5-10% will produce quite significant flickering.
Life Span: how long the particle will live in seconds
Life Span Variation: particle life will randomly vary from lifetime by this value
Again adding life span variation will add flickering.
The values of Life Span and Life Span Variation must be the same as the equivalent values in SpawnModifier.

The area covered by ENB particle lights depends primarily on the particle size, therefore Initial Size is the primary controller of how big your light source is. However there's an upper limit for this. Values above about 100 or so for Initial Size will make a bigger particle but will not increase light coverage. This is an ENB limitation and is the main reason why an ENB particle light torch has a limited light radius. The only way to go around this is by having more particles spread around but this has a significant performance cost.


SimpleColorModifier

This is a very powerful tool which controls the fade in/fade out of the particle and how its colors change throughout its lifetime. You can adjust each color and the transitions between them (where 0.0 is particle birth and 1.0 is particle death).
FadeIn / Fade Out percents are self explanatory. The particle fades from invisible at 0.0 to 'current color' at FadeIn value, and fades out from 'current color' at FadeOut to invisible at 1.0. If both are set to 0 there's no fade. Fade in / out help with smoothing out things. 'current color' would depend on the settings below.
Then we have 4 color percent values which are all mislabeled in NifSkope. They relate to the 3 color values in Colors.
Color 1 End Percent is actually what it says, the particle will be color 1 from 0.0 to this value.
Color 1 Start Percent is actually Color 2 Start Percent; meaning the particle will transition from color 1 to color 2 in the span between the previous value and this value.
Color 2 End Percent is what it says. The particle will be color 2 in the span between the previous value and this value.
Color 2 Start Percent is actually Color 3 Start Percent. The particle will transition between color 2 and color 3 in the span between the previous value and this value, and will stay at color 3 from this value to 1.0.
So if we take the values on the image as example, if we take a particle with a lifetime of 1.0 and set 0.1, 0.25, 0.75 and 1.0 for these 4 values, the particle will be color 1 (white) until 0.1 life, then it will transition from color 1 to color 2 between 0.1 life and 0.25 life, then stay at color 2 from 0.25 to 0.75 life, and then spend the remaining quarter of its life transitioning from color 2 to color 3. At the same time it will fade in for the first quarter second and then fade out for the last quarter second. There is some overlap between the fade and color transition functionality but that just gives you more control.

Now you have to keep in mind that your final light intensity is a result of Emissive Color and Emissive Multiple in EffectShaderProperty, and of FadeIn/Out and the 3 color values in SimpleColorModifier. This means you can more or less achieve the same end result by different routes.

Also keep in mind that your brightness also depends on the FadeIn/Out values, meaning that the more fade there is, the shorter the particle stays at its full brightness and vice-versa.

You can do whatever you feel works best for you however my one strong recommendation is to be consistent, because in the event that you end up
with 100 files that you created over time, and set intensity via emissive color in some files, via emissive multiple in others, and via simplecolor modifier in yet others, and then need to go back and do changes across all 100 files, you will give up on modding for life.


ScaleModifier

This is another powerful tool which allows you to change the size of the particle during its lifetime. Typically this is set up so that the particle grows in size over time and then gets smaller nearing death, however for the purpose of creating a ball of light I set it up so it only grows (as explained below). You could also input a set of random values to simulate random size fluctuations.

There is great synergy between SimpleColorModifier and ScaleModifier: using them both in sync allows you to create an intensity/color gradient for your light from center to edge. For example you can set the initial color to warm yellow and the end color to colder blue tones, and set the scales to increase from 0.75 to 1.0 - the result will be a light ball with warm center and cool edges. My torch particle light colors are set to gradient from yellow-orange to dull red  as the scales are set to grow, in order to simulate a light which is warmer towards the center of the flame and cools down a bit outwards. This is actually something you can't do with vanilla lights, meaning ENB particle lights give you more artistic options than vanilla lights even if the actual mechanics are a bit roundabout. Explosions are a different paradigm where you start at low size and increase it in a linear or non-linear fashion depending on your desired effect. Shout particles also do the same although in a sigle direction rather than omnidirectionally like explosions.

You can change the number of Scales by changing the Num Scales values. I am not sure if there's a difference between having 2 scales which go 0.5, 1.0, or having 10 scales which cover the same range but more gradually, however more scales allow you to do basically scale curves, keeping in mind that each scale is positioned at a fixed 1 / (num scales) location in time. An example of a scale curve would be 5 scales with values of 0.5, 0.55, 0.6, 0.8, 1.0 - the particle will grow very slowly for the first 3/5ths of its life and then rapidly expand for the last 2/5ths.


SpawnModifier

There's not much to fiddle with here except making sure that the Life Span and Life Span Variation values match those in the Emitter modifier. You better know what you're doing if you play with any of the other values.


AgeDeathModifier, PositionModifier, BoundUpdateModifier

These are just required for the particle system to work and best not changed at all.


If you want to learn what every value does on your own, I suggest this:

- open the candleflame mps file (obviously have a copy first)
- set emissive multiplier to 1.0
- set emissive color to pure white (1,1,1,1)
- set all colors in simplecolormodifier to pure white and fadein/out to 0
- set life span variance to 0
- set radius variation to 0
- set emitter size to 0

Now fiddle with the various values one at a time until you have a good idea how they work.
Sometimes it may even be helpful to switch temporarily to a visible glow texture to better see your particle.

Article information

Added on

Edited on

Written by

4109

4 comments

  1. leotric
    leotric
    • member
    • 0 kudos
    thank you, very cool. is it possible to get a guide that talks about the bomb modifier and other movement related modifiers. totally understandable if you can't.
  2. chickmetalhead
    chickmetalhead
    • supporter
    • 164 kudos
    Thank you so much for this article! I play on LE, so I can't use your ENB Light mod you have on SE. But this write up allowed me to fix a set of meshes that were giving off a glaring white light, instead of a more subdued colored light as I expected. The key thing I needed, was that the color values in a BSPSysSimpleColorModifier (if used as a modifier to an NiParticleSystem node) overrides the color specified in the BSEffectShaderProperty. After changing that pure white color in BSPSysSimpleColorModifier to the desired color, it looks great!

    Kudos point given for you because you shared this knowledge here - I know how hard it must have been to discover, and it is VERY appreciated!
    1. Alexkid1996
      Alexkid1996
      • member
      • 7 kudos
      It works on LE, just convert meshes and esp.
  3. cthunsthrall
    cthunsthrall
    • premium
    • 235 kudos
    thanks a lot for the guide, really helpful. i assume this doesn't matter but in the ENB light files i've seen some of these particle systems have "Spawn Speed Variation" in the spawn modifier set to -0.0 and others set 0.0, and i've noticed these negative zeroes show up in a lot of other areas of meshes just generally. now i assume this is irrelevant since zero is zero, not an integer, but the fact that nifskope actually remembers it and saves it in the file has me tripping a bit. like if it's actually saving in the file then -0.0 is necessarily different from 0.0, or else when i write -0 and save and restart, it should revert back to 0, right? that negative operator has to be encoded in the file somehow and i'm wondering if it is encoded in the bit for the value itself. and then if that's the case should i be setting these to regular zero? thanks