Principled Thin wall + absorption filtering

Have made a simple backfacing based setup for filtering the albedo color with vains mask from albedo is based of simple inverting and contrast increase depending on the albedo ofc.


with 0.9 absorption fac
For comparison without absorption filtering.

Awesome. A question, why invert the color of the texture?

Thanks.Because this leaf albedo has very bright veins, I inverted the albedo so that the veins become darker, and then used the result as an absorption multiplier.

For other albedo maps, the method you use to create the absorption map is entirely up to you.

Here the preview from the albdeo to vein mask

This absorption map gets mulitiplyed by the absorption color to get the filtering mask

In the last color mix the amount between white (1,1,1) and the filter result gets interpolated as mix fac how strong the original albedo gets filtered,thats it

If you dont need the vein masking and want only the absorption color its very easy to do.


This is basicly all you need for only absorption color
you can control the mix amount of absorption filter color via the fac

Front = Sun facing, dark shiny, adaxial side.

Back = In shade, bright rough, abaxial side.

The problem is that absorption isn’t an effect based on backfacing, but the not present thickness. So I would go further, one shader node setup for Front ; darker color, less roughness, and a different bump map than the Back side; brighter color, rougher reflections (due to the micro texture from the pores). Some grasses are much more uniform. I can’t think of anything to properly mimic a leaf with the current limitations of Principled. Do it manually, although you might not be able to get the identical response wrt energy conservation.

That would be mix of diffuse and translucency (typically less than 0.5). Then mixed with a colored refraction (Geometry/Incoming normal based) with big roughness, if you want a hint of lightsource hotspot. Then mixed with a semi rough glossy using your favorite method of “PBR.fresnel” that accounts for roughness and flipped normal, possibly microroughness (will not be equal to Principled, but “good enough” for practical purposes).

Then you do the exact same setup for the backside using a different texture set. Maybe reduce the white glossy for the Back side to mimic specular energy loss due to the pores, even if albedo is brighter.

With Front and Rear set up manually, you mix these with a Geometry/Backfacing.

Finally, you mix in Transparency Shader using the Alpha map.

For Principled to work for this, we’d need:

  • Separate color for Translucency. It’s typically about increasing the saturation (and lowering value?) based on the fake thickness map. Just using the SSS radius as a color input would be good enough.
  • Separate roughness for refraction. This is an absolute must. Octane uses “Extra Roughness”. I don’t know if a furnace test is passable with this setup. E.g. if using microroughness (roughness decreases with increasing viewing angle), that would cause havoc on refraction. If you don’t care about refraction or microroughness for leafs, this is also something that can be seen on tracing paper (or baking/pizza paper).
  • Separate normal for refraction. Ideally, but this is mostly to fake other Thin Wall effects. It’s an unrealistic hack, but very useful.

Of course, getting these maps is hard. Might want to craft your own based on the one set for the Front side.

The pre-filtering method I used is basically the same as what a transparent shader does.

For example, with a transparent shader, (1,1,1) is fully transparent, while (0,0,0) blocks all light. Any value in between 0 and 1 allows a corresponding amount of light to pass through.

The multiply-based pre-filter works in exactly the same way. This also happens in translucent materials.

Thickness does not necessarily represent physical absorption. It depends on the material itself. For example, if the veins of a material are hollow, like in Swiss cheese, or contain water, like in plants, they can transmit more light. On the other hand, the veins of a leaf may have much higher absorption.

However, this is mainly a mapping issue, similar to what you might encounter with SSS maps. It’s up to the artist to decide how dense, thick, or transparent a material should appear.

By the way, if you wanted to, you could also generate a thickness map from a 3D model, similar to how a height map can be generated.

Filtering should be working as said.Btw if you want to calc your absorption map then use the Beer-Lamberts law to generate a map based on physics.

You mean scattering effect by roughness in the medium.Keep in mind this filtering is based on a thin filter and not a volume based calc like a SSS. You could blur the albedo and the filter map to get a scattering roughness effect for the backside.

I think its do doable to a degree but makes mostly sence in a hardcoded shader like the principled because this needs closure calulations of the surface normal for the refraction i guess.

Look at the Open PBR thin wall spec.It works like a double side calculated shader.the best would be to have a filtering for the middle to get the simulated transclucent absorption/coloration view and lightdirection independent with the amount based on the anisothropy

If you want to scientific calculations here is a good site

With my old RYB color converter node group to get absorption for RYB wavelengths with Beer-Lamberts equations with thickness control.

Here a example with maprange that uses random object data for thickness preview

And a render with more moderat random thickness

some autumn settings,absorption preview

rendering with the autumn absorption settings and slightly different thickness variations