Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/kernel_path_surface.h
| Show First 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | for(int i = 0; i < kernel_data.integrator.num_all_lights; i++) { | ||||
| int num_samples = ceil_to_int(num_samples_adjust*light_select_num_samples(kg, i)); | int num_samples = ceil_to_int(num_samples_adjust*light_select_num_samples(kg, i)); | ||||
| float num_samples_inv = num_samples_adjust/(num_samples*kernel_data.integrator.num_all_lights); | float num_samples_inv = num_samples_adjust/(num_samples*kernel_data.integrator.num_all_lights); | ||||
| RNG lamp_rng = cmj_hash(*rng, i); | RNG lamp_rng = cmj_hash(*rng, i); | ||||
| for(int j = 0; j < num_samples; j++) { | for(int j = 0; j < num_samples; j++) { | ||||
| float light_u, light_v; | float light_u, light_v; | ||||
| path_branched_rng_2D(kg, &lamp_rng, state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v); | path_branched_rng_2D(kg, &lamp_rng, state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v); | ||||
| float terminate = path_branched_rng_light_termination(kg, &lamp_rng, state, j, num_samples); | |||||
| LightSample ls; | LightSample ls; | ||||
| if(lamp_light_sample(kg, i, light_u, light_v, ccl_fetch(sd, P), &ls)) { | if(lamp_light_sample(kg, i, light_u, light_v, ccl_fetch(sd, P), &ls)) { | ||||
| /* The sampling probability returned by lamp_light_sample assumes that all lights were sampled. | /* The sampling probability returned by lamp_light_sample assumes that all lights were sampled. | ||||
| * However, this code only samples lamps, so if the scene also had mesh lights, the real probability is twice as high. */ | * However, this code only samples lamps, so if the scene also had mesh lights, the real probability is twice as high. */ | ||||
| if(kernel_data.integrator.pdf_triangles != 0.0f) | if(kernel_data.integrator.pdf_triangles != 0.0f) | ||||
| ls.pdf *= 2.0f; | ls.pdf *= 2.0f; | ||||
| if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp)) { | if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp, terminate)) { | ||||
| /* trace shadow ray */ | /* trace shadow ray */ | ||||
| float3 shadow; | float3 shadow; | ||||
| if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | ||||
| /* accumulate */ | /* accumulate */ | ||||
| path_radiance_accum_light(L, throughput*num_samples_inv, &L_light, shadow, num_samples_inv, state->bounce, is_lamp); | path_radiance_accum_light(L, throughput*num_samples_inv, &L_light, shadow, num_samples_inv, state->bounce, is_lamp); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* mesh light sampling */ | /* mesh light sampling */ | ||||
| if(kernel_data.integrator.pdf_triangles != 0.0f) { | if(kernel_data.integrator.pdf_triangles != 0.0f) { | ||||
| int num_samples = ceil_to_int(num_samples_adjust*kernel_data.integrator.mesh_light_samples); | int num_samples = ceil_to_int(num_samples_adjust*kernel_data.integrator.mesh_light_samples); | ||||
| float num_samples_inv = num_samples_adjust/num_samples; | float num_samples_inv = num_samples_adjust/num_samples; | ||||
| for(int j = 0; j < num_samples; j++) { | for(int j = 0; j < num_samples; j++) { | ||||
| float light_t = path_branched_rng_1D(kg, rng, state, j, num_samples, PRNG_LIGHT); | float light_t = path_branched_rng_1D(kg, rng, state, j, num_samples, PRNG_LIGHT); | ||||
| float light_u, light_v; | float light_u, light_v; | ||||
| path_branched_rng_2D(kg, rng, state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v); | path_branched_rng_2D(kg, rng, state, j, num_samples, PRNG_LIGHT_U, &light_u, &light_v); | ||||
| float terminate = path_branched_rng_light_termination(kg, rng, state, j, num_samples); | |||||
| /* only sample triangle lights */ | /* only sample triangle lights */ | ||||
| if(kernel_data.integrator.num_all_lights) | if(kernel_data.integrator.num_all_lights) | ||||
| light_t = 0.5f*light_t; | light_t = 0.5f*light_t; | ||||
| LightSample ls; | LightSample ls; | ||||
| if(light_sample(kg, light_t, light_u, light_v, ccl_fetch(sd, time), ccl_fetch(sd, P), state->bounce, &ls)) { | if(light_sample(kg, light_t, light_u, light_v, ccl_fetch(sd, time), ccl_fetch(sd, P), state->bounce, &ls)) { | ||||
| /* Same as above, probability needs to be corrected since the sampling was forced to select a mesh light. */ | /* Same as above, probability needs to be corrected since the sampling was forced to select a mesh light. */ | ||||
| if(kernel_data.integrator.num_all_lights) | if(kernel_data.integrator.num_all_lights) | ||||
| ls.pdf *= 2.0f; | ls.pdf *= 2.0f; | ||||
| if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp)) { | if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp, terminate)) { | ||||
| /* trace shadow ray */ | /* trace shadow ray */ | ||||
| float3 shadow; | float3 shadow; | ||||
| if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | ||||
| /* accumulate */ | /* accumulate */ | ||||
| path_radiance_accum_light(L, throughput*num_samples_inv, &L_light, shadow, num_samples_inv, state->bounce, is_lamp); | path_radiance_accum_light(L, throughput*num_samples_inv, &L_light, shadow, num_samples_inv, state->bounce, is_lamp); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* sample one light at random */ | /* sample one light at random */ | ||||
| float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT); | float light_t = path_state_rng_1D(kg, rng, state, PRNG_LIGHT); | ||||
| float light_u, light_v; | float light_u, light_v; | ||||
| path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v); | path_state_rng_2D(kg, rng, state, PRNG_LIGHT_U, &light_u, &light_v); | ||||
| float terminate = path_state_rng_light_termination(kg, rng, state); | |||||
| LightSample ls; | LightSample ls; | ||||
| if(light_sample(kg, light_t, light_u, light_v, ccl_fetch(sd, time), ccl_fetch(sd, P), state->bounce, &ls)) { | if(light_sample(kg, light_t, light_u, light_v, ccl_fetch(sd, time), ccl_fetch(sd, P), state->bounce, &ls)) { | ||||
| /* sample random light */ | /* sample random light */ | ||||
| if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp)) { | if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp, terminate)) { | ||||
| /* trace shadow ray */ | /* trace shadow ray */ | ||||
| float3 shadow; | float3 shadow; | ||||
| if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | ||||
| /* accumulate */ | /* accumulate */ | ||||
| path_radiance_accum_light(L, throughput*num_samples_adjust, &L_light, shadow, num_samples_adjust, state->bounce, is_lamp); | path_radiance_accum_light(L, throughput*num_samples_adjust, &L_light, shadow, num_samples_adjust, state->bounce, is_lamp); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | #ifdef __EMISSION__ | ||||
| bool is_lamp; | bool is_lamp; | ||||
| #ifdef __OBJECT_MOTION__ | #ifdef __OBJECT_MOTION__ | ||||
| light_ray.time = ccl_fetch(sd, time); | light_ray.time = ccl_fetch(sd, time); | ||||
| #endif | #endif | ||||
| LightSample ls; | LightSample ls; | ||||
| if(light_sample(kg, light_t, light_u, light_v, ccl_fetch(sd, time), ccl_fetch(sd, P), state->bounce, &ls)) { | if(light_sample(kg, light_t, light_u, light_v, ccl_fetch(sd, time), ccl_fetch(sd, P), state->bounce, &ls)) { | ||||
| if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp)) { | float terminate = path_state_rng_light_termination(kg, rng, state); | ||||
| if(direct_emission(kg, sd, emission_sd, &ls, state, &light_ray, &L_light, &is_lamp, terminate)) { | |||||
| /* trace shadow ray */ | /* trace shadow ray */ | ||||
| float3 shadow; | float3 shadow; | ||||
| if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | if(!shadow_blocked(kg, emission_sd, state, &light_ray, &shadow)) { | ||||
| /* accumulate */ | /* accumulate */ | ||||
| path_radiance_accum_light(L, throughput, &L_light, shadow, 1.0f, state->bounce, is_lamp); | path_radiance_accum_light(L, throughput, &L_light, shadow, 1.0f, state->bounce, is_lamp); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 98 Lines • Show Last 20 Lines | |||||