diff options
author | Mathieu Menuet <bliblubli> | 2017-09-12 16:13:55 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2017-09-12 16:37:35 +0300 |
commit | 659ba012b0f30450c6de13f8b1c2fccce32fc461 (patch) | |
tree | 95dbfbcdec4f20f6cf39b8c0657fa02f7bce64fa /intern/cycles/kernel/split | |
parent | d2202117fe2cb596e4a6d817300e8f46428ee956 (diff) |
Cycles: change AO bounces approximation to do more glossy and transmission.
Rather than treating all ray types equally, we now always render 1 glossy
bounce and unlimited transmission bounces. This makes it possible to get
good looking results with low AO bounces settings, making it useful to
speed up interior renders for example.
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D2818
Diffstat (limited to 'intern/cycles/kernel/split')
-rw-r--r-- | intern/cycles/kernel/split/kernel_indirect_background.h | 2 | ||||
-rw-r--r-- | intern/cycles/kernel/split/kernel_scene_intersect.h | 16 |
2 files changed, 11 insertions, 7 deletions
diff --git a/intern/cycles/kernel/split/kernel_indirect_background.h b/intern/cycles/kernel/split/kernel_indirect_background.h index 04d5769ef0d..2e9231caa3e 100644 --- a/intern/cycles/kernel/split/kernel_indirect_background.h +++ b/intern/cycles/kernel/split/kernel_indirect_background.h @@ -33,7 +33,7 @@ ccl_device void kernel_indirect_background(KernelGlobals *kg) if(ray_index != QUEUE_EMPTY_SLOT) { if(IS_STATE(ray_state, ray_index, RAY_ACTIVE)) { ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; - if(state->bounce > kernel_data.integrator.ao_bounces) { + if(path_state_ao_bounce(kg, state)) { kernel_split_path_end(kg, ray_index); } } diff --git a/intern/cycles/kernel/split/kernel_scene_intersect.h b/intern/cycles/kernel/split/kernel_scene_intersect.h index d0afd39ef29..99095f8fcbc 100644 --- a/intern/cycles/kernel/split/kernel_scene_intersect.h +++ b/intern/cycles/kernel/split/kernel_scene_intersect.h @@ -60,13 +60,13 @@ ccl_device void kernel_scene_intersect(KernelGlobals *kg) } Intersection isect; - PathState state = kernel_split_state.path_state[ray_index]; + ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; Ray ray = kernel_split_state.ray[ray_index]; /* intersect scene */ - uint visibility = path_state_ray_visibility(kg, &state); + uint visibility = path_state_ray_visibility(kg, state); - if(state.bounce > kernel_data.integrator.ao_bounces) { + if(path_state_ao_bounce(kg, state)) { visibility = PATH_RAY_SHADOW; ray.t = kernel_data.background.ao_distance; } @@ -76,18 +76,22 @@ ccl_device void kernel_scene_intersect(KernelGlobals *kg) uint lcg_state = 0; if(kernel_data.bvh.have_curves) { - if((kernel_data.cam.resolution == 1) && (state.flag & PATH_RAY_CAMERA)) { + if((kernel_data.cam.resolution == 1) && (state->flag & PATH_RAY_CAMERA)) { float3 pixdiff = ray.dD.dx + ray.dD.dy; /*pixdiff = pixdiff - dot(pixdiff, ray.D)*ray.D;*/ difl = kernel_data.curve.minimum_width * len(pixdiff) * 0.5f; } extmax = kernel_data.curve.maximum_width; - lcg_state = lcg_state_init(&state, 0x51633e2d); + lcg_state = lcg_state_init_addrspace(state, 0x51633e2d); } bool hit = scene_intersect(kg, ray, visibility, &isect, &lcg_state, difl, extmax); #else + if(path_state_ao_bounce(kg, state)) { + visibility = PATH_RAY_SHADOW; + ray.t = kernel_data.background.ao_distance; + } bool hit = scene_intersect(kg, ray, visibility, &isect, NULL, 0.0f, 0.0f); #endif kernel_split_state.isect[ray_index] = isect; @@ -95,7 +99,7 @@ ccl_device void kernel_scene_intersect(KernelGlobals *kg) #ifdef __KERNEL_DEBUG__ PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; - if(state.flag & PATH_RAY_CAMERA) { + if(state->flag & PATH_RAY_CAMERA) { L->debug_data.num_bvh_traversed_nodes += isect.num_traversed_nodes; L->debug_data.num_bvh_traversed_instances += isect.num_traversed_instances; L->debug_data.num_bvh_intersections += isect.num_intersections; |