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__