multiscattering GGX , DFG lut

as we know, Eric Heitz's Research Page
Darkening increases with roughness due to single scattering.


energy conversion can be achieved by using Multiple-Scattering

Image above comes from google filament, in which a real-time approach of multi-scatter was shown.https://google.github.io/filament/Filament.md.html
-code implementation like this:


 
 vec3 energyCompensation = 1.0 + f0 * (1.0 / dfg.y - 1.0);  // Scale the specular lobe to account for multiscattering  Fr *= pixel.energyCompensation; 


 
 vec2 dfg = textureLod(dfgLut, vec2(dot(n, v), roughness), 0.0).xy;  // (1 - f0) * dfg.x + f0 * dfg.y  vec3 specularColor = mix(dfg.xxx, dfg.yyy, f0); 

A DFG LUT was used in code above
dfg.png
So the problem is : How can I fit that LUT into unreal engine?

Generate the texture as needed on the fly. Check SystemTextures.cpp for reference.
Bind that texture as a resource to all shaders in question(deferred light shader, reflection environment, post process ambient etc). Add the code to every specular F term in use. Don’t forget that pre-integrated IBL would need a special treatment.


I’ve tried multi scatter in my shading model testbed with a static LUT.Result is really satisfied.
But I’m still not able to figure out how to done that in unreal engine source code.
Generate an RT LUT runtime and use that in shading model seems overcomplicate in unreal engine.
How to create LUT? How to use that LUT in my shading model code? These are still mystery to me.

This would be super nice and quite cheap PBR addition for UE4 renderer. Good test for multiscattering is to White furnace test. So your lighting enviroment is fully white. White metal sphere in that kind of light enviroment should be also fully white. If your model lose or gain any energy you see it clearly from just watching the image.
There are some nice images about Furnace test. Energy Compensation Pt. 1 - PataBlog

Gotta agree here. Spec multiscatter will partially help with notorious white sheen appearance as artists would stop overcompensating intensities.

It is somewhat not exactly trivial task overall, especially considering that GGX multi-scatter is quite recent thing. I must admit I don’t have a clue how to apply that to pre-integrated cubemaps, but I did not look into the subject enough.

Man I would love to see this integrated! <3