21
21
/* Direction Emission */
23
__device float3 direct_emissive_eval(KernelGlobals *kg, float rando,
24
LightSample *ls, float u, float v, float3 I)
23
__device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
24
LightSample *ls, float u, float v, float3 I, float t, float time)
26
26
/* setup shading at emitter */
36
#ifdef __OBJECT_MOTION__
35
39
ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f);
36
40
ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f);
41
#ifdef __CAMERA_MOTION__
37
44
shader_setup_from_background(kg, &sd, &ray);
38
eval = shader_eval_background(kg, &sd, 0);
45
eval = shader_eval_background(kg, &sd, 0, SHADER_CONTEXT_EMISSION);
43
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v);
51
if(ls->type == LIGHT_STRAND)
52
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ls->prim);
55
shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time);
46
59
/* no path flag, we're evaluating this for all closures. that's weak but
47
we'd have to do multiple evaluations otherwise */
48
shader_eval_surface(kg, &sd, rando, 0);
60
* we'd have to do multiple evaluations otherwise */
61
shader_eval_surface(kg, &sd, rando, 0, SHADER_CONTEXT_EMISSION);
50
63
/* evaluate emissive closure */
51
64
if(sd.flag & SD_EMISSION)
54
67
eval = make_float3(0.0f, 0.0f, 0.0f);
57
72
shader_release(kg, &sd);
62
__device bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
77
__device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
63
78
float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval,
70
#ifdef __MULTI_LIGHT__
83
#ifdef __NON_PROGRESSIVE__
72
85
/* sample position on a specified light */
73
light_select(kg, lindex, randu, randv, sd->P, &ls, &pdf);
86
light_select(kg, lindex, randu, randv, sd->P, &ls);
78
91
/* sample a light and position on int */
79
light_sample(kg, randt, randu, randv, sd->P, &ls, &pdf);
92
light_sample(kg, randt, randu, randv, sd->time, sd->P, &ls);
84
pdf = light_sample_pdf(kg, &ls, -ls.D, ls.t);
89
98
/* evaluate closure */
90
float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D);
99
float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, ls.t, sd->time);
92
101
if(is_zero(light_eval))
100
109
shader_bsdf_eval(kg, sd, ls.D, eval, &bsdf_pdf);
102
if(ls.prim != ~0 || ls.type == LIGHT_BACKGROUND) {
111
if(ls.shader & SHADER_USE_MIS) {
103
112
/* multiple importance sampling */
104
float mis_weight = power_heuristic(pdf, bsdf_pdf);
113
float mis_weight = power_heuristic(ls.pdf, bsdf_pdf);
105
114
light_eval *= mis_weight;
107
/* todo: clean up these weights */
108
else if(ls.shader & SHADER_AREA_LIGHT)
109
light_eval *= 0.25f; /* area lamp */
110
else if(ls.t != FLT_MAX)
111
light_eval *= 0.25f*M_1_PI_F; /* point lamp */
113
bsdf_eval_mul(eval, light_eval/pdf);
117
bsdf_eval_mul(eval, light_eval/ls.pdf);
115
119
if(bsdf_eval_is_zero(eval))
139
*is_lamp = (ls.prim == ~0);
143
/* return if it's a lamp for shadow pass */
144
*is_lamp = (ls.prim == ~0 && ls.type != LIGHT_BACKGROUND);
144
/* Indirect Emission */
149
/* Indirect Primitive Emission */
146
__device float3 indirect_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf)
151
__device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderData *sd, float t, int path_flag, float bsdf_pdf)
148
153
/* evaluate emissive closure */
149
154
float3 L = shader_emissive_eval(kg, sd);
157
if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_SAMPLE_AS_LIGHT) && (sd->segment == ~0)) {
151
159
if(!(path_flag & PATH_RAY_MIS_SKIP) && (sd->flag & SD_SAMPLE_AS_LIGHT)) {
152
161
/* multiple importance sampling, get triangle light pdf,
153
and compute weight with respect to BSDF pdf */
162
* and compute weight with respect to BSDF pdf */
154
163
float pdf = triangle_light_pdf(kg, sd->Ng, sd->I, t);
155
164
float mis_weight = power_heuristic(bsdf_pdf, pdf);
172
/* Indirect Lamp Emission */
174
__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission)
177
int lamp = lamp_light_eval_sample(kg, randt);
182
if(!lamp_light_eval(kg, lamp, ray->P, ray->D, ray->t, &ls))
185
/* todo: missing texture coordinates */
188
float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ls.t, ray->time);
190
if(!(path_flag & PATH_RAY_MIS_SKIP)) {
191
/* multiple importance sampling, get regular light pdf,
192
* and compute weight with respect to BSDF pdf */
193
float mis_weight = power_heuristic(bsdf_pdf, ls.pdf);
163
201
/* Indirect Background */
165
__device float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf)
203
__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf)
167
205
#ifdef __BACKGROUND__
168
206
/* evaluate background closure */
170
208
shader_setup_from_background(kg, &sd, ray);
171
float3 L = shader_eval_background(kg, &sd, path_flag);
209
float3 L = shader_eval_background(kg, &sd, path_flag, SHADER_CONTEXT_EMISSION);
172
210
shader_release(kg, &sd);
174
212
#ifdef __BACKGROUND_MIS__
178
216
if(!(path_flag & PATH_RAY_MIS_SKIP) && res) {
179
217
/* multiple importance sampling, get background light pdf for ray
180
direction, and compute weight with respect to BSDF pdf */
218
* direction, and compute weight with respect to BSDF pdf */
181
219
float pdf = background_light_pdf(kg, ray->D);
182
220
float mis_weight = power_heuristic(bsdf_pdf, pdf);