RTX renderer support for multi scattering () in MDL bsdf's

sorry bit of a cross post but not sure where to stick this:

I noticed in some white furnace test in Create that my own hand rolled MDL materials - and indeed the built in PBR surface - exhibit the traditional darkening on grazing angles at high roughness - presumably due to microfacet shadowing BSDF’s not accounting for multi scattering effects (which is a well know problem with microfacet bsdfs in general)

In the MDL docs however there appears to be a specific term added to compensate for this: multiscatter_tint() in the bsdfs it provides (pretty much all of which are microfacet based)

However setting this doesn’t seem to have any effect in Create - it doesn’t throw up any compiler errors either…

can anyone from Nvidia confirm if this just isn’t implemented in Create right now?

example below illustrates the problem:

Screenshot 2021-04-19 222713

If the multiscatter_tint() mechanism is working, I presumably shouldn’t be getting any darkened areas on these spheres - or it should be less in any case (my shader on the left which implements multiscatter_tint: color(1.0), the native PBR shader on the right)

Hi @bold.stelvis
multiscattering_tint() is not yet enabled in RTX. It should be available in Iray rendering mode though.

I hope that’s helpful.
@fpliu

thanks - think I checked with Iray and noticed the same thing - but will definitely recheck that

is there any source of more information on its expected effect? (the MDL handbook just says it fully compensates given color(1.0) as an input, but I couldn’t find any visual examples or additional information as to expected implementation)

more testing and I can’t detect any difference between RTX mode and Iray (inside Create at least)- neither seem to be affected by adjusting multiscatter_tint() in any way I can detect

might this be limited to certain bsdf’s? (in Iray, given the information that RTX does not implement it at all)

scratch that - the compensation term DOES indeed work in Iray - I can see this if I only have the specualr_bsdf active with no underlying diffuse:

these test have5 spheres with roughness values ranging from 0.05 (far left) to 0.95 (far right)

Iray - specular_bsdf only, multiscatter_tint = 0.85 (at 1.0 you can’t se the spheres at all which is correct):

Iray - specular_bsdf only, multiscatter_tint = 0.1 - obvious darkening on rougher spheres:

however If I then layer the specular_bsdf over a standard diffuse_bsdf - using either a custom_curve_layer or a fresnel_layer - I get the darkened edge effect to show up:

Iray - layered bsdfs , multiscatter_tint = 1.0 (so set to max compensation):

obvious albedo loss on the edges of the rougher spheres now which seems to be caused by the layer function itself (which has no energy loss term) mixing the spec over the diffuse (this image shows a custom curve layer mix, grazing angle reflectivity set to 1.0, normal angle reflectivity set to 0.5 - much higher than realistic for a dielectric material - more realistic values for normal reflectivity look worse)

if I dial the layer weight back to 0.0 - revealing the pure underlying diffuse bsdf it looks like this:

the general darkening is down to the Oren nayar diffuse bsdf which is also getting rougher on the spheres to the right (no energy compensation term) but the edges look correct and obviously brighter than when the specular bsdf is layered over the top

changing the specular bsdf itself doesn’t seem to matter (I tried various GGX variants and the simple_glossy variant)

seems to me the layering function itself is lossy for some reason? (IOR based fresnel_layer does the same thing)