Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/kernel_volume.h
| Context not available. | |||||
| const float object_step_size, | const float object_step_size, | ||||
| float t, | float t, | ||||
| float *step_size, | float *step_size, | ||||
| float *step_offset) | float *step_offset, | ||||
| float *first_step_size) | |||||
| { | { | ||||
| const int max_steps = kernel_data.integrator.volume_max_steps; | const int max_steps = kernel_data.integrator.volume_max_steps; | ||||
| float step = min(object_step_size, t); | float step = min(object_step_size, t); | ||||
| Context not available. | |||||
| *step_size = step; | *step_size = step; | ||||
| *step_offset = path_state_rng_1D_hash(kg, state, 0x1e31d8a4) * step; | *step_offset = path_state_rng_1D_hash(kg, state, 0x1e31d8a4) * step; | ||||
| *first_step_size = path_state_rng_1D_hash(kg, state, 0x3d22c7b3) * step; | |||||
| } | } | ||||
| /* Volume Shadows | /* Volume Shadows | ||||
| Context not available. | |||||
| /* prepare for stepping */ | /* prepare for stepping */ | ||||
| int max_steps = kernel_data.integrator.volume_max_steps; | int max_steps = kernel_data.integrator.volume_max_steps; | ||||
| float step_offset, step_size; | float step_offset, step_size, first_step_size; | ||||
| kernel_volume_step_init(kg, state, object_step_size, ray->t, &step_size, &step_offset); | kernel_volume_step_init(kg, state, object_step_size, ray->t, &step_size, &step_offset, &first_step_size); | ||||
| /* compute extinction at the start */ | /* compute extinction at the start */ | ||||
| float t = 0.0f; | float t = 0.0f; | ||||
| Context not available. | |||||
| for (int i = 0; i < max_steps; i++) { | for (int i = 0; i < max_steps; i++) { | ||||
| /* advance to new position */ | /* advance to new position */ | ||||
| float new_t = min(ray->t, (i + 1) * step_size); | float new_t = min(ray->t, i * step_size + first_step_size); | ||||
| /* use random position inside this segment to sample shader, adjust | /* use random position inside this segment to sample shader, adjust | ||||
| * for last step that is shorter than other steps. */ | * for last step that is shorter than other steps. */ | ||||
| Context not available. | |||||
| /* prepare for stepping */ | /* prepare for stepping */ | ||||
| int max_steps = kernel_data.integrator.volume_max_steps; | int max_steps = kernel_data.integrator.volume_max_steps; | ||||
| float step_offset, step_size; | float step_offset, step_size, first_step_size; | ||||
| kernel_volume_step_init(kg, state, object_step_size, ray->t, &step_size, &step_offset); | kernel_volume_step_init(kg, state, object_step_size, ray->t, &step_size, &step_offset, &first_step_size); | ||||
| /* compute coefficients at the start */ | /* compute coefficients at the start */ | ||||
| float t = 0.0f; | float t = 0.0f; | ||||
| Context not available. | |||||
| for (int i = 0; i < max_steps; i++) { | for (int i = 0; i < max_steps; i++) { | ||||
| /* advance to new position */ | /* advance to new position */ | ||||
| float new_t = min(ray->t, (i + 1) * step_size); | float new_t = min(ray->t, i * step_size + first_step_size); | ||||
| float dt = new_t - t; | float dt = new_t - t; | ||||
| /* use random position inside this segment to sample shader, | /* use random position inside this segment to sample shader, | ||||
| Context not available. | |||||
| /* prepare for volume stepping */ | /* prepare for volume stepping */ | ||||
| int max_steps; | int max_steps; | ||||
| float step_size, step_offset; | float step_size, step_offset, first_step_size; | ||||
| if (object_step_size != FLT_MAX) { | if (object_step_size != FLT_MAX) { | ||||
| max_steps = kernel_data.integrator.volume_max_steps; | max_steps = kernel_data.integrator.volume_max_steps; | ||||
| kernel_volume_step_init(kg, state, object_step_size, ray->t, &step_size, &step_offset); | kernel_volume_step_init(kg, state, object_step_size, ray->t, &step_size, &step_offset, &first_step_size); | ||||
| # ifdef __KERNEL_CPU__ | # ifdef __KERNEL_CPU__ | ||||
| /* NOTE: For the branched path tracing it's possible to have direct | /* NOTE: For the branched path tracing it's possible to have direct | ||||
| Context not available. | |||||
| for (int i = 0; i < max_steps; i++, step++) { | for (int i = 0; i < max_steps; i++, step++) { | ||||
| /* advance to new position */ | /* advance to new position */ | ||||
| float new_t = min(ray->t, (i + 1) * step_size); | float new_t = min(ray->t, i * step_size + first_step_size); | ||||
| float dt = new_t - t; | float dt = new_t - t; | ||||
| /* use random position inside this segment to sample shader, | /* use random position inside this segment to sample shader, | ||||
| Context not available. | |||||