Is Unreal´s Specular Fresnel Outdated?

Hi everyone and merry cristmas!

I create archviz visualizations with unreal on a pretty realistic level. See some of my work here in case you are interested: Login • Instagram

I love what you can achieve with unreal engine, but as always I am looking for a way to improve my results even further and also for ways to improve things in a way that surpasses the engine´s normal capabilities.

For quite some time I thought that the fresnel of unreal´s specular doesn´t look to great, so …

  • I isolated the fresnel
  • of unreal and vray
  • and started comparing both results
  • using different IOR values inside vray
  • and trying to achieve the same inside unreal

For people who are interested how I did it, I did it by:

  • using a pure white HDRI for lighting
  • that was set invisible (BG only)
  • giving a sphere a completely black diffuse color
  • turning tonemapper, bloom, SSR etc. inside Unreal off
  • setting the same exposure by using a sphere with a single color and with no specular as a reference
  • (at least) trying to make some settings so that other sphere´s don´t affect each other regarding lighting (did work in vray, but not in unreal with GPU lightmass)

Here some example results of Vray:

https://drive.google.com/file/d/1A8m…ew?usp=sharing

From left to right different IOR values (I think 1.2, 1.46, 2 and 2.5)
From top to bottom simply different reflection amount.
The white sphere was used for exposure matching of unreal and vray.
Don´t mind the red circle.

I could now show some comparison screenshots of unreal, but to make it short:

  • Unreal´s fresnel just matches a single IOR value pretty close (1.3 or so, don´t remember exactly since I don´t have my pc here)

  • but the edges are still to bright (noticeable) and the mid (between center and edges) to dark (always refering to the visual sphere results of my vray screen in this post)

  • other IORs couldn´t be reproduced since even if you plug a “custom fresnel node” into the specular input the default fresnel of the specular determines the maximum value that you can reach for a pixel

  • unreal´s specular fresnel seems to work like a multiplier here

  • whatever you put into the specular input of a material, be it a single value or a fresnel node, it seems to get multiplied by the default fresnel

  • for example this way recreating higher IOR fresnels simply is not possible since the multiplication with the default fresnel will lead to a way to weak reflection amount in the center

  • datasmith results seem very unrealistic to me and way to strong since it uses the metallic input which shouldn´t be used because of tinted reflections

  • also Unreal by default changes diffuse/base color based on the specular value you set, which I don´t like at all. I think they do it in order to create some fake fresnel effect. Why? I don´t know, even though I have some theories.

  • I used Clear Coat shader to get rid of this effect in my experiments

  • setting default specular to 0 and using clear coat specular amount only

After comparing I just can say that I think that it would be great for Unreal if Epic would update the specular options of materials. And by that I mean…

  • creating a shader setting that allows you to plug custom fresnel function outputs into the specular input of a material (which is disabling/removing the default fresnel as multiplier)
  • and also a settings that disables the effect that the specular amount affects the luminance of the albedo/diffuse color

Of course Epic´s strategy was always to make the shader “easy to master” as they even wrote in some documents, looking ´however at more and more people coming from archviz to unreal and knowing that Epic by default always cared a lot about making things as flexible/customizable as possible too I think these 2 settings would add quite a lot more realism.

Some people might think it would be very expensive to create custom/realstic fresnels, however I could already recreate other fresnels simulating other IORs very easily and with low costs by…

  • adding and subtracting multiple different fresnel outputs
  • and also by using multiplication

So what do you guys think?

Would be nice to hear your thoughts, where I am possibly wrong and if it is already achievable with some hacks/custom coding.

Thanks,
Marcus

Unreal’s stock shading is capable of using IOR ranges from 1 to ~1.78 for dielectrics.

It may or may not be so. Not much can said without seeing decent quality comparison. In any case, if it is so, what you referring to as Fresnel is irrelevant to the problem.

That is also fundamentally wrong. Specular input expects reflectance, not “custom fresnel node”.

Specular input in Unreal is reflectance at normal incidence.

Covered above.

Surely it is possible. You would need to edit shader to remap specular to new reflectange range. But you would likely never need it and whole shading is pretty tailored to stay within 1-1.7 IOR range.

Not sure what would that mean.

I’d suggest you to get more familiar with PBR. Those workarounds are not something usually practiced.

Fresnel and its approximations are well defined functions. Honestly, no reason to customize anything here.

I think You’ve mixed up 4 not so related terms in that sentence.

There are uncountable ways of how shading in Unreal could get much better for production, but this is not one of them.

Most of the people, however, agree, that staying physically based yields better, more consistent and stable results.

One of the guys definitely thinks meh.

If you are coming from Vray, specular input in Unreal is your IOR input, rest is pretty much the same.

I know well enough what is put into specular usually and how PBR works. I was just wondering what is going on when you try to plug your own fresnel node into the input, it looked strange and I couldn´t tell what exactly is going on, hoping that it will somehow work to improve quality. But you are right, it seems to work just how it should and my attempt was just wrong. Still it would be nice if you could plug your own function in there and inserting the reflectivity value inside this function on your own, be it a map or a single value.

About the base color thing:

Just put a value higher than 0 into specular (default material) and you will see that the base color is starting to change slightly (unlit mode). For me it looks like luminance is increased or “white added”, I haven´t tested enough to tell how colors are changed exactly on RGB level. I would like to disable this behaviour. Knowing why it is done would be very interesting too. Thanks to everyone who does already and who can explain.

Does anyone know how I change IOR to this 1 - 1.78 range quickly? I just haven´t seen it yet. For now I am limited to an IOR of about 1.3 which I would like to change.

Also is there a simple way to create your completely own fresnel for the specular?

I am helpful for every link or tip so I can start researching better.

And to Deathrey : You can argue whatever you want what is better and more important. I am just trying to improve things and hoping that other people also have fun trying to do so. Still thanks for your input and answer.

Specular input, from 0 - 1 maps to base reflectance in 0-0.08 range. Pretty sure you can read up online on how to convert reflectance to IOR and the other way around.

Base color is not changed in any way and used as is. Unlit mode is not showing basecolor.

What you are artistically referencing to as fresnel, is an effect, caused by many separate factors, where actual Fresnel reflectance is only part of it. And it is not something that should be subject of customization in any way. There surely are ways to create your completely own fresnel, at which point it will stop counting as fresnel. But why, especially when your work is all about real materials ?

Indeed I can and that is perfectly fine. Being feedback section, one can expect some disagreement with your suggestions.

Thanks for the info. I will take some time to continue some quality comparisons in a few days. Probably I will make some quick and easy adjustments in future.

The documentation says Unlit mode shows base color. And try it: Set a material to for example pure black and set specular to 0 and after that to 1 and measure both results with a color picker. You will measure a difference probably with most colors you set as base color. Specular affects base color.

It’s interesting to note that the docs somewhere in Unreal docs about Fresnel and its two main nodes, suggest a number of IOR values to use for different refraction effects. One of those is 2.42, I think, which is for diamond. That’s a bit far outside the 1-1.7 range. So is the 1-1.7 range a different mathematical reference than the proposed IOR values in the docs?

Nah.

No, it is not different.

I used a Fresnel value of 3.0 in a glass material, and it produced an effect of pushing in the Fresnel glow around the inner boundary of the preview sphere. It also generated more refractive curving of light reflection inside the preview sphere. How is it not physically based? It is physically based, especially when looking at various types of curved, clear surfaces of objects such as glasses, bubbles, light bulbs, artistic décor, and such. What is the hangup of staying within the 1-1.7 range? I can’t see the impetus to invoking it as an industry standard, especially in video games.

@Deathrey Unreal Engine Issues and Bug Tracker (UE-89413) The rendered result is correct (I tested myself), however the unlit mode is currently wrong.

Also: After testing all Fresnels of the 1 - 1.78 IOR range at the beginning of this year I must say fresnels from IORs 1.3 - 1.78 are good and from 1.3 to 1.0 it gets worse and worse.