diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 650e3b0..93f29a7 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -612,6 +612,10 @@ ccl_device_inline float4 kernel_path_integrate(KernelGlobals *kg, debug_data_init(&debug_data); #endif +#ifdef __VOLUME__ + float3 P_end = ray.P + ray.D*ray.t; +#endif + #ifdef __SUBSURFACE__ SubsurfaceIndirectRays ss_indirect; kernel_path_subsurface_init_indirect(&ss_indirect); @@ -678,7 +682,15 @@ ccl_device_inline float4 kernel_path_integrate(KernelGlobals *kg, /* volume attenuation, emission, scatter */ if(state.volume_stack[0].shader != SHADER_NONE) { Ray volume_ray = ray; - volume_ray.t = (hit)? isect.t: FLT_MAX; + if(hit) { + volume_ray.t = isect.t; + } + else if((state.flag & PATH_RAY_CAMERA) && ray.t != FLT_MAX) { + volume_ray.t = len(P_end - ray.P); + } + else { + volume_ray.t = FLT_MAX; + } bool heterogeneous = volume_stack_is_heterogeneous(kg, state.volume_stack); diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h index 7c685e3..4170c2d 100644 --- a/intern/cycles/kernel/kernel_path_branched.h +++ b/intern/cycles/kernel/kernel_path_branched.h @@ -239,6 +239,10 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in debug_data_init(&debug_data); #endif +#ifdef __VOLUME__ + float3 P_end = ray.P + ray.D*ray.t; +#endif + /* Main Loop * Here we only handle transparency intersections from the camera ray. * Indirect bounces are handled in kernel_branched_path_surface_indirect_light(). @@ -278,8 +282,16 @@ ccl_device float4 kernel_branched_path_integrate(KernelGlobals *kg, RNG *rng, in /* volume attenuation, emission, scatter */ if(state.volume_stack[0].shader != SHADER_NONE) { Ray volume_ray = ray; - volume_ray.t = (hit)? isect.t: FLT_MAX; - + if(hit) { + volume_ray.t = isect.t; + } + else if(ray.t != FLT_MAX) { + volume_ray.t = len(P_end - ray.P); + } + else { + volume_ray.t = FLT_MAX; + } + bool heterogeneous = volume_stack_is_heterogeneous(kg, state.volume_stack); #ifdef __VOLUME_DECOUPLED__