No SSR reflections on PBRMaterial w/ .metallic=0

Hi,

Is it possible to enable SSR reflections for PBRMaterial with .metallic=0?

cc @Evgeni_Popov

When metallic is 0, the calculated reflectivity is 0.04, and since the reflectivityThreshold parameter is set to 0.04 by default, no SSR effect is calculated.

You can set reflectivityThreshold = 0 to have the SSR calculated as well, but you won’t see the change visually because the SSR is very small, because of the way we currently calculate it (we are discussing internally about another way to perform this calculation). You can change the strength and reflectionSpecularFalloffExponent parameters to make the reflection more visible in this case (you will also have to adapt the reflectivity of the standard materials to account for these changes):

Compared to the effect on the StandardMaterial the reflection on PBRMaterial is barely visible. I think this is incorrect. There should not be 1:100 difference between pbr and standard material.
Increasing .strength doesn’t produce effect similar to the StandardMaterial and ground plane looks whitish.

The comparison with the standard material is not fair because the reflectivity is not the same in both cases. If you want to better compare, you should use a specular color of (0.04, 0.04, 0.04) in the standard material case, because it is the reflectivity which is computed in the PBR case when metallic = 0.

Note that in the metallic/roughness mode, the reflectivity is calculated by the shader, so these lines have no effect:

    pbrPlane.reflectivityColor.r = 0.75;
    pbrPlane.reflectivityColor.g = 0.75;
    pbrPlane.reflectivityColor.b = 0.75;

You can simply comment out the metallic / roughness property assignments (line 69-70) if you want to switch to the specular/glossiness model, where you can set the reflectivity color directly: you will see that you will get the same reflection as with a standard material.

In the metallic/roughness mode, we plan to provide a more accurate calculation for the SSR effect that will produce visible reflections even when metallic=0, but it is not finalized yet. It would generate the following image (without changing the strength and reflectivityThreshold default values):

The reflection is clearly visible in the shot.

Thank you for this detailed explanation. I did compare with StandardMaterial, because both StandardMaterial and PBRMaterial are similar models of the real world phenomena and should provide mostly same visuals.
I use glTF workflow, so all the materials in the scene are PBRMaterial with metallic-roughness model. And scene contains both metals and non-metals. So turning parameters for non-metal material will ruin rendering of another materials.
On the following screenshot you can see the real difference between non-metal and metal. The reflection on the left image (non-metal) is barely visible and cleary visible on metallic surface at the right.


The result is clearly unacceptable because of obvious difference in reflection level. So using SSR with PBRMaterial(s) looks impossible.
I just wanted to switch from reflection probes to SSR to achieve better visuals. Are there any way to achieve comparable reflections for PBRMaterial metal/non-metal on the same scene?

Yes, tweaking the parameters is clearly not the definitive solution, I provided it only as a workaround for a specific use case / scene.

Here’s how it would look with the changes we plan (that you can test in this PG):

This is using the right mix factor (==fresnel) between the current color of the pixel and the reflected color.

Okay, thank you for your time!

Not sure that the reflection level on the left image is correct, reflections are barely visible. In the real word high gloss materials have well defined reflections. Something about 25-30% of the metallic level.
I have a mirror with a glossy frame - the reflections on the frame is about 10-15% of the (perfect) mirrored reflections.

It’s a standard fresnel mix between the current color pixel and the reflected pixel color, I don’t think we can do anything else (?) (Godot is doing the same thing to merge the SSR effect with the current color pixel).

Thank you. I’ll try to employ specular-glosiness model. Seems metallic-roughness model is better suitable for metals.

https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/SSRRenderingPipeline#use-fresnel

According to the documentation, if I enable Fresnel, surfaces should still reflect even if ‘metallic’ is set to 0 and ‘reflectivityThreshold’ is 0.04. However, this isn’t the case in practice. I reviewed the shader code and found that if the value is less than ‘reflectivityThreshold’, the program doesn’t proceed further.

The doc does not say this. On the contrary, you must lower the threshold if you want the effect to be calculated for small reflectivity values. See the comment below the screenshots, the threshold has been reduced to 0.001 for the second screenshot.

Okay, it seems I misunderstood.