I did these code changes a while back but they have not been integrated into the main branch yet. They were used for a recent mclaren GDC demo though so that means there is a good chance it will be merged back to main.
https://www.youtube.com/watch?v=0oZfvoG6qYQ
Jump to around the 1:42 mark.
There is some cost. The second normal has to be converted to an octahedron and written to the gbuffer data and then converted back in the deferred side. The cost is not crazy but is there. And then it uses up the only two remaining gbuffer channels so you pay some cost in flexibility as well. For that reason it was implemented as a project setting.
Here is a shot showing how it can mimic anisotropy fairly well:


We also used the bottom normal to add some very subtle flakes to the bottom coat. This was used in conjunction with some roughness variation textures that were jittered with camera motion. We had photos from actual samples to tweak from like this which was pretty neat:
keep in mind the sparkles on our material were scaled way down since were were mapping to a car, not the tiny sample models that were in the reference photos. What is shown there is something a bit in between and they had to be scaled down way smaller for the final 4k demo resolution.
By using the jittered roughness mask as a very minor basecolor mask, we could give the sparkles some coloration as well. It was a bit of a trick that worked but you have to look very close to the 4k tv to see it.
Hopefully this will get merged to main for 4.13 or so. If anybody is dying to do it before then we could probably post the changes somewhere like github.
