How to achieve Decoupled Particle Lighting?

I’m not sure if this is even related to RT VFX, but it somewhat is ig because it is about shading smoke particles ultimately.
Anyway, it is about Decoupled particle lighting… does anyone know how could I achieve this in a game engine unreal or unity? could anyone share any info on this if they know?

also, I’m very interested in learning how this works as in some theory explanation will be helpful what does decoupled particle lighting even mean? (I researched many ways of shading particles/smoke vfx, and I believe as a student it’s just good to know… and it’s just super interesting too.) so if u guys don’t know how to achieve this, could u share any info on how this works on the computation side. like learned about raymarching is a thing and a visual explanation of how the code behaves is out there, similarly i would be interested in learning how this is happening too. any info on this from ur side will be helpful

also for those interested in the full siggraph pdf (it starts from around page 27)

I think the answer lies in these tree slides, which look like an RT Virtual texture approach to particular shading.

They experimented with various techniques from shading per vertex to shading per pixel(both options can be found in unreal material settings for volume rendering).

In the end, they found a middle ground to approach the shadow pass with a 4K RT atlas which stores the shadow passes on a per particle(or emitter?) 32x32 pixel space to store the information, then they upscale it with bicubic interpolation and multiply it with the full particle resolution as seen in the code.

You could potentially store other information on the 4K RT atlas and add that to the particles which makes them decupled from the rest of the scene.

Here in the Star Citizen example, you can see that the shadow quality has dropped not by a lot but the fps has doubled. But if you look at the before and after you can see the upscaling artifact like obvious linear gradients or streaking in some cases.

P.S. This is my broad understanding of the topic, feel free to correct me if you find more information.


Thank you so much for your explanation.
I think I do get what’s going on much more clear now , I hope so but I still can’t get my head around on how do I approach the middle ground as you said inside a game engine like unreal, how do I store the shadow passes per particle (or emitter), not just that how should one approach in capturing the shadow in parallel before I store them.
Pls excuse me if any of my questions are stupid, but how do I exactly grab the “lighting” before I multiply it with albedo map. And finally lets say all this works, lets say the runtime texture does stores the shadow passes. How do tell my smoke fx material or maybe my niagara system to grab that rendering behavior? As always any more info is helpful… Thanks again!!