In my own experiments I did not include any sort of view-dependent effect, which – I know – is a pretty huge part of how translucency shaders usually work. I was more interested in exploring other properties, playing with IBL which is not frequently explored in translucency shading. Integrating IBL wasn’t exactly easy – the way I see it, when you look at an object against a light source, you’ll see that light source scattered. If the object is smooth enough you should see the light source as a small point (or whatever shape it has). As the object scatters more light, that same background is going to be, well, more scattered. So the idea is to blur the IBL, but what about dynamic light sources – would an inverted specular algorithm suffice?
Here’s me playing with blur and Beer’s law:
Some jelly, for reference:
Here’s a slightly different setting. I wanted it to look closer to a smoked glass, so there’s some refraction applied.
I’d like to showcase another method that I developed, useful for opaque objects, like wax, soapstone, marble and the likes. Here’s a reference first:
The idea is to bake the object-space normals of the object in two different normal maps, one for the positive and one for the negative axis. This allows me to extend the normal map from each axis and overlap them, effectively emulating how light is transmitted from each side of the cube. The final normals are then normalized and reconstructed from the object rotation.
The normal maps can be generated by simply baking the object as illuminated from each individual side (so 6 channels). Proper baking would include actually emulating translucency, but I found out I could obtain a decent approximation by convoluting the normal map with a blur in object space. So thin parts like the nose will bleed a lot of light, etc.
This allows for some incredible results at key angles even with very low resolution maps. The object gets a nice volumetric feeling even with no view-dependent code.
I hope I can get back to working on translucency shaders someday. I’m not sure if this method can be realistically used in a real-time asset pipeline, so I didn’t improve much on it, but it was a lot of fun to get to these results.