P.S. The relevant code is:
const vec3 light_dir = normalize(light_o - o_subsurface);
vec3 trace_position = o_subsurface;
const float total_depth = distance(light_o, o_subsurface);
float running_depth = 0;
vec3 last_trace_position = trace_position;
while(true)
{
traceRayEXT(topLevelAS, gl_RayFlagsOpaqueEXT, 0xff, 0, 0, 0, trace_position, tmin, light_dir, tmax, 0);
// Hit the sky
if(rayPayload.dist == -1.0)
break;
last_trace_position = trace_position;
trace_position += light_dir*rayPayload.dist;
if(dot(light_dir, rayPayload.normal) >= 0.0)
running_depth += distance(trace_position, last_trace_position);
// Hit the light
if(rayPayload.color.r > 1
|| rayPayload.color.g > 1
|| rayPayload.color.b > 1)
{
break;
}
}
rayPayload = r;
total += mask.r;
total += mask.g;
total += mask.b;
float x = 1.0 - running_depth/total_depth;
x = (x - 0.5) * 5.0 + 0.5; // contrast
local_colour += x*rayPayload.subsurface;
ret_colour += local_colour;