Alright, so after reading through pages and pages for most of the night (seriously, I was up until 5AM, that’s how captivating and complex the topic is atm), I am now more confused than ever with regard to UE4’s seemingly unique take on PBR. Let me explain, or try to.
First off there’s a pretty intense thread going on right now at Polycount where very knowleadgeable people (including Joe Wilson) are discussing the in and outs of the system, and there’s a lot of disagreeing going on, with some seemingly very experienced artists labelling some of what A. Maximo says in his tutorials as fairly innacurate or downright wrong. It has lots of very interesting inputs, and it’s a good read.
The topic was specifically created because someone is compiling a massive document on PBR and was seeking input from experts.
Now to what is really confusing me specifically regarding UE4, and I’d appreciate an answer from someone at Epic on this, is this: so now I understand enough on the topic to know there are basically two different workflows, metalness or specular
Quote from A. Maximo (everyone agrees on this, from what I can see):
Natural evolution of real-time graphics finally brought us to a point where specular highlight approximation system that we used to have is no longer necessary. We have reflections now. First of all you have to remember that specularity/reflectivity you define in PBR engines is at facing angles only. Everything has Fresnel reflections now so your surface’s reflectivity is going to increase the more grazing the viewing angle becomes relative to the surface normal. If you have any questions about this part please refer to me PBR theory video. Now depending on your engine there are 2 ways things can go with specularity:
- You still go with the specular texture. Most of your dielectrics on this texture will be confined to a the range of [0,04 to 0,08] and your metals are going to be starting somewhere around 0.6. For most of the metals you will also be using carefully measured values provided by your technical artist( or the internet! ) thanks dontnod - You will either have to manually keep track of energy conservation between your Albedo and Specular: A + S <= Amount of Incoming Light, or your programmers will have to hook something up for you to “renormalize” the lighting energy in your textures.
- You might have to multiply your specular texture by your AO depending on how good your screen-space AO and self reflection is. Right now more often than not reflections are calculated with “light probes” that don’t provide enough fidelity for self masking and self reflection, so you end up with shiny recesses all around your model. And this is something you have to compensate for with your AO.
- You ditch the Specular texture and go with Metallic texture instead. Metallic is as straightforward as it sounds: objects made out of metal are generally white on this texture and dielectric are black. Grey values would usually be reserved for transition between layered materials like say dirty metal. I personally like this set-up ‘cause it is very straightforward and leaves little room for ever. One this you have to remember(if you’re making a realistic game) is to never fudge the Metallic values just because you think it’s going to look cool. It usually doesn’t. If the material is not a metal - paint it black. You’ll have plenty of other maps to be creative with. Also if your asset is made completely out of dielectrics, which happens often enough, you don’t need a specular/metallic map altogether and can go by with just a float value instead of map. And finally don’t forget that the more metallic your surface gets the closer to black your albedo contribution becomes. For explanation please refer to my “theory behind PBR” video.
Whatever situation you end up in regarding specular/metallic please remember that no high or mid frequency details is supposed to be in these textures. You only define the types of materials present in your surface with almost flat values and all the major mid to small variation is going to happen in the Roughness Map. *
The issue is UE4 doesn’t seem to follow either. From UE4 documentation I dig up the following:
The Metallic input literally controls how “metal-like” your surface will be. Nonmetals have Metallic values of 0, metals have Metallic values of 1. For pure surfaces, such as pure metal, pure stone, pure plastic, etc. this value will be 0 or 1, not anything in between. When creating hybrid surfaces like corroded, dusty, or rusty metals, you may find that you need some value between 0 and 1.*
So obviously, no metalness map should be plugged in there, which excludes the metalness workflow.
And then regarding Specular:
The Specular input should not be connected and left as it’s default value of 0.5 for most cases.
It is value between 0 and 1 and is used to scale the current amount of specularity on non-metallic surfaces. It has no effect on metals.*
And then it proceeds to explain that this is actually where you would plug your cavity map for dielectrics if you had one, which excludes the specular workflow (and simultaneously showed me that gametextures.com way of doing it is completely wrong, I’m going to contact them on this).
Soooo, what is this third workflow we’re supposed to use in UE4? What am I missing here? Could please someone englighten me?