Unexpected light reflection with different materials

Hi guys!

I have a question related to different materials and how they react to light.

I’ve created this scene where I have four cubes, each of them from four different materials (Phong, Lambert, Standard and Physical). I am measuring the color of a pixel in each of these materials.

In the scene I have one directional light on top with intensity = 1. I would expect the color in these four materials to be the same, assuming they are well configured.

In the LambertMaterial and the PhysicalMaterial everything is working as expected, the light reflected is 1:

const material2 = new THREE.MeshLambertMaterial( {
    side: THREE.FrontSide,
    reflectivity: 0.0,
    color: new THREE.Color(0xffffff),
})

const material4 = new THREE.MeshPhysicalMaterial( {
    side: THREE.FrontSide,
    clearcoat: 0.0,
    reflectivity: 0.0,
    sheen: 0.0,
    specularIntensity: 0.0,
    color: new THREE.Color(0xffffff),
})

With the Standard one, I get slightly different results:
Instead of 1 I get 1.0100404024124146

const material3 = new THREE.MeshStandardMaterial( {
    side: THREE.FrontSide,
    roughness: 1,
    emissiveIntensity: 0, 
    metalness: 0, 
    color: new THREE.Color(0xffffff),
})

With this configuration, I observe that the result is the same as if I used a Physical material without setting the reflectivity/specularIntensity to 0 . That means, as if the Standard material had some reflectivity/specularIntensity set by default.

Is that the expected behavior? Is there any way I could configure the Standard material to have no reflectivity/specularIntensity?

Lastly, the same applies to the PhongMaterial, is this an expected result?

const material1 = new THREE.MeshPhongMaterial( {
    side: THREE.FrontSide,
    reflectivity: 0.0,
    emissiveIntensity: 0.0,
    shininess: 0.0, 
    specular: new THREE.Color(0x000000), 
    color: new THREE.Color(0xffffff),
})

You can find the code here: https://jsfiddle.net/javiersanjuan/xahgpczq/

Thanks a lot!

1 Like

Note that .reflectivity in MeshPhysicalMaterial is a different thing than .reflectivity in the Phong and Lambert models. In the Physical model it’s an alias for .ior with different parameterization. MeshPhysicalMaterial is an extension of MeshStandardMaterial, adding more advanced PBR properties. The .reflectivity / .ior properties are examples of these — most users do not need them, so they don’t exist on MeshStandardMaterial. MeshStandardMaterial has a fixed reflectivity value corresponding to a fixed IOR of 1.5.

1 Like

So the .reflectivity / .ior in the Physical material is not really an extra property missing in the Standard material? (i.e.: the Standard material has the same property implemented, only fixed instead of configurable). If so, why not exposing that property in the Standard material?

I always thought an extended material had more properties and was, as a result, more computationally expensive. But, for what you mention here, it wouldn’t be more expensive/complex if the fixed .ior of 1.5 was exposed and configurable by the user in the Standard material. Or am I missing something?

1 Like

The Physical material has more properties and is more computationally expensive, yes. Increasingly expensive as you enable more of its effects. But any PBR model must define IOR somehow, and so the Standard material does define it internally. This is an advanced and rarely-used property, and so there are no plans to move it to the Standard model.

1 Like

Increasingly expensive as you enable more of its effects

@donmccurdy Does that mean that a Physical material declared as in the question above (with clearcoat, reflectivity, sheen and specularIntensity set to 0) could perform as well as the Standard material with roughness set to 1 and metalness/emissiveIntensity set to 0? (or even better, since the effect of the IOR is disabled in the Physical material but cannot be disabled in the Standard material)

1 Like

I doubt Physical can be configured to perform any better than Standard, but I’m not sure whether its defaults perform the same or perform worse. (haven’t tested this)

1 Like