MeshStandardMaterial: Reflections visible for moderate roughness values

Comparing MetalRoughSpheres in a few different engines:

engine screenshot
three.js screen shot 2018-01-13 at 12 56 00 pm
babylon.js screen shot 2018-01-13 at 12 56 08 pm
qtek screen shot 2018-01-13 at 12 55 02 pm

THREE.MeshStandardMaterial is noticeably more reflective at moderate roughness values compared to other engines, and perhaps smoother/shinier than content artists would intend.

@emackey brought this up on another thread, and mentioned that Blender and Substance Painter also look similar to the other engines.

Author: Fantashit

5 thoughts on “MeshStandardMaterial: Reflections visible for moderate roughness values

  1. This one?

    // TODO, replace 8 with the real maxMIPLevel
    vec3 radiance = getLightProbeIndirectRadiance( /*specularLightProbe,*/ geometry, Material_BlinnShininessExponent( material ), 8 );
    

    https://github.com/mrdoob/three.js/blob/dev/src/renderers/shaders/ShaderChunk/lights_template.glsl#L138-L139

    I replaced 8 with 11(=Math.log2(2048), width and height of the envMap texture used in that Three.js example are 2048) and the result looks closer to other engines’.

    image

  2. I will do this weekend! Sorry, finding an apartment in Berlin is much harder than I thought and I’ve spent time for it this week..

  3. Quick observations:

    • Our PMREM (our convolved environment map) is a hack right now and is not properly calibrated. The perceived roughness can change very easily. For example this minor tweak by @mrdoob affected the perceived roughness of all scenes in Three.JS — it made everything more biased towards rougher surfaces: 18fef30#diff-3778d4e48bf0b6191c066c52a48ca6c9 The issue isn’t that @mrdoob‘s change is right or wrong, but that the whole PMREM is a hack in terms of its blurred results — it is uncalibrated.

    • You need to ensure two things match between Painter and Three.JS and they should be done separately. The first is light reflections. This uses the glsl ggx shader. Match Painter and Three.JS with just lists and no environment. Get it right. Then as a separate step you need to calibrate the environment map convolution/blur to match Painter at the correct roughnesses — this is a mess because our roughness/blur is uncalibrated and easy to tweak depending on minor settings.

    • We should be rewriting the PMREM to use a proper importance sampling approach so that it is proper calibrated and then we can reliably match references like Painter. Basically what is proposed in this PR but which it doesn’t actually realize correctly: #15390

Comments are closed.