35 if ((ls->prim !=
PRIM_NONE) &&
dot(ls->Ng, ls->D) > 0.0f) {
62 ls->Ng = emission_sd->Ng;
87 make_float3(klight->strength[0], klight->strength[1], klight->strength[2]));
96 const float rand_terminate)
102 if (
kernel_data.integrator.light_inv_rr_threshold > 0.0f) {
105 if (probability < 1.0f) {
106 if (rand_terminate >= probability) {
135 const float u = 1.0f - sd->u - sd->v;
136 const float v = sd->u;
137 const float w = sd->v;
146 const float a =
dot(
N[2] -
N[0],
V[0] -
V[2]);
147 const float b =
dot(
N[2] -
N[1],
V[1] -
V[2]);
148 const float c =
dot(
N[1] -
N[0],
V[1] -
V[0]);
149 float h = a * u * (u - 1) + (a +
b + c) * u *
v +
b *
v * (
v - 1);
152 if (
dot(n, Ng) > 0) {
157 h0 =
max(
dot(
V[0] -
P,
N[0]) + h0, 0.0f);
158 h1 =
max(
dot(
V[1] -
P,
N[1]) + h1, 0.0f);
159 h2 =
max(
dot(
V[2] -
P,
N[2]) + h2, 0.0f);
166 h0 =
max(
dot(
P -
V[0],
N[0]) + h0, 0.0f);
167 h1 =
max(
dot(
P -
V[1],
N[1]) + h1, 0.0f);
168 h2 =
max(
dot(
P -
V[2],
N[2]) + h2, 0.0f);
169 h =
min(-
min(
min(h0, h1), h2), h * 0.5f);
185 const float offset_cutoff =
190 if (offset_cutoff > 0.0f) {
192 const bool transmit = (
NL < 0.0f);
197 const float3 Ng = (transmit ? -sd->Ng : sd->Ng);
198 const float NgL =
dot(Ng,
L);
200 const float offset_amount = (
NL < offset_cutoff) ?
201 clamp(2.0f - (NgL +
NL) / offset_cutoff, 0.0f, 1.0f) :
202 clamp(1.0f - NgL / offset_cutoff, 0.0f, 1.0f);
204 if (offset_amount > 0.0f) {
209 *r_skip_self = (NgL > 0.0f);
221 const bool skip_self)
248 ray->time = sd->time;
251 ray->self.object = (skip_self) ? sd->object :
OBJECT_NONE;
252 ray->self.prim = (skip_self) ? sd->prim :
PRIM_NONE;
253 ray->self.light_object = ls->object;
254 ray->self.light_prim = ls->prim;
264 bool skip_self =
true;
282 const float forward_pdf,
285#ifdef WITH_CYCLES_DEBUG
300 const float forward_pdf)
302#ifdef WITH_CYCLES_DEBUG
307 return (forward_pdf == 0.0f);
331 const int object_receiver,
333 const uint32_t path_flag,
354 kg, rand, time,
P,
D, object_receiver, shader_flags, bounce, path_flag, ls);
362 const int object_receiver,
363 const int shader_flags,
365 const uint32_t path_flag,
385 kg, rand, time,
P,
N, object_receiver, shader_flags, bounce, path_flag, ls);
394 const uint32_t path_flag)
412 ls->pdf *= ls->pdf_selection;
425 const uint32_t path_flag,
440 const float t = sd->ray_length;
453 sd->prim - prim_offset + lookup_offset);
469 const uint32_t path_flag,
505 const uint32_t path_flag,
514 const uint32_t path_flag)
ccl_device_forceinline void area_light_mnee_sample_update(const ccl_global KernelLight *klight, ccl_private LightSample *ls, const float3 P)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
reduce_max(value.rgb)") DEFINE_VALUE("REDUCE(lhs
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
ccl_device_inline bool light_sample_terminate(KernelGlobals kg, ccl_private BsdfEval *ccl_restrict eval, const float rand_terminate)
ccl_device_forceinline void light_sample_update(KernelGlobals kg, ccl_private LightSample *ls, const float3 P, const float3 N, const uint32_t path_flag)
ccl_device_inline void light_sample_to_surface_shadow_ray(KernelGlobals kg, const ccl_private ShaderData *ccl_restrict sd, const ccl_private LightSample *ccl_restrict ls, ccl_private Ray *ray)
CCL_NAMESPACE_BEGIN ccl_device_noinline_cpu Spectrum light_sample_shader_eval(KernelGlobals kg, IntegratorState state, ccl_private ShaderData *ccl_restrict emission_sd, ccl_private LightSample *ccl_restrict ls, const float time)
ccl_device_inline float light_sample_mis_weight_forward(KernelGlobals kg, const float forward_pdf, const float nee_pdf)
ccl_device_inline float light_sample_mis_weight_forward_background(KernelGlobals kg, IntegratorState state, const uint32_t path_flag)
ccl_device bool light_sample_from_position(KernelGlobals kg, const float3 rand, const float time, const float3 P, const float3 N, const int object_receiver, const int shader_flags, const int bounce, const uint32_t path_flag, ccl_private LightSample *ls)
ccl_device_inline void light_sample_to_volume_shadow_ray(const ccl_private ShaderData *ccl_restrict sd, const ccl_private LightSample *ccl_restrict ls, const float3 P, ccl_private Ray *ray)
ccl_device_inline float light_sample_mis_weight_nee(KernelGlobals kg, const float nee_pdf, const float forward_pdf)
ccl_device_inline void shadow_ray_setup(const ccl_private ShaderData *ccl_restrict sd, const ccl_private LightSample *ccl_restrict ls, const float3 P, ccl_private Ray *ray, const bool skip_self)
ccl_device_inline float light_sample_mis_weight_forward_distant(KernelGlobals kg, IntegratorState state, const uint32_t path_flag, const ccl_private LightSample *ls)
ccl_device_inline float3 shadow_ray_offset(KernelGlobals kg, const ccl_private ShaderData *ccl_restrict sd, const float3 L, ccl_private bool *r_skip_self)
ccl_device_inline float light_sample_mis_weight_forward_lamp(KernelGlobals kg, IntegratorState state, const uint32_t path_flag, const ccl_private LightSample *ls, const float3 P)
ccl_device_inline float light_sample_mis_weight_forward_surface(KernelGlobals kg, IntegratorState state, const uint32_t path_flag, const ccl_private ShaderData *sd)
ccl_device_inline float3 shadow_ray_smooth_surface_offset(KernelGlobals kg, const ccl_private ShaderData *ccl_restrict sd, const float3 Ng)
ccl_device_inline bool light_sample_from_volume_segment(KernelGlobals kg, const float3 rand, const float time, const float3 P, const float3 D, const float t, const int object_receiver, const int bounce, const uint32_t path_flag, ccl_private LightSample *ls)
#define kernel_assert(cond)
#define ccl_device_forceinline
#define kernel_data_fetch(name, index)
#define ccl_device_noinline_cpu
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_make_compact(const float dD)
ccl_device_forceinline float differential_zero_compact()
ccl_device_inline float light_distribution_pdf_lamp(KernelGlobals kg)
CCL_NAMESPACE_BEGIN ccl_device int light_distribution_sample(KernelGlobals kg, const float rand)
ccl_device_inline void triangle_vertices_and_normals(KernelGlobals kg, const int prim, float3 P[3], float3 N[3])
constexpr T clamp(T, U, U) RET
ccl_device_inline void object_dir_transform(KernelGlobals kg, const ccl_private ShaderData *sd, ccl_private float3 *D)
ccl_device float background_light_pdf(KernelGlobals kg, const float3 P, float3 direction)
ccl_device_inline bool light_sample(KernelGlobals kg, const int lamp, const float2 rand, const float3 P, const float3 N, const int shader_flags, const uint32_t path_flag, ccl_private LightSample *ls)
ccl_device_inline int light_link_receiver_forward(KernelGlobals kg, IntegratorState state)
@ SD_BSDF_HAS_TRANSMISSION
@ PRIMITIVE_MOTION_TRIANGLE
@ DIRECT_LIGHT_SAMPLING_NEE
@ DIRECT_LIGHT_SAMPLING_FORWARD
@ SD_OBJECT_TRANSFORM_APPLIED
ccl_device_inline Spectrum rgb_to_spectrum(const float3 rgb)
ccl_device_forceinline void point_light_mnee_sample_update(KernelGlobals kg, const ccl_global KernelLight *klight, ccl_private LightSample *ls, const float3 P, const float3 N, const uint32_t path_flag)
ccl_device_forceinline float triangle_light_pdf(KernelGlobals kg, const ccl_private ShaderData *sd, const float t)
ccl_device_inline bool bsdf_eval_is_zero(ccl_private BsdfEval *eval)
ccl_device_inline void bsdf_eval_mul(ccl_private BsdfEval *eval, const float value)
ccl_device_inline Spectrum bsdf_eval_sum(const ccl_private BsdfEval *eval)
ccl_device_inline float2 fabs(const float2 a)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
ccl_device_inline float3 safe_normalize_len(const float3 a, ccl_private float *t)
#define PROFILING_INIT_FOR_SHADER(kg, event)
#define PROFILING_EVENT(event)
#define PROFILING_SHADER(object, shader)
ccl_device float power_heuristic(const float a, const float b)
ccl_device_inline void motion_triangle_vertices_and_normals(KernelGlobals kg, const int object, const int prim, const float time, float3 verts[3], float3 normals[3])
@ PROFILING_SHADE_LIGHT_SETUP
@ PROFILING_SHADE_LIGHT_EVAL
ccl_device_inline void shader_setup_from_sample(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, const float3 P, const float3 Ng, const float3 I, const int shader, const int object, const int prim, const float u, const float v, const float t, const float time, const bool object_space, const bool is_lamp)
ccl_device_inline void shader_setup_from_background(KernelGlobals kg, ccl_private ShaderData *ccl_restrict sd, const float3 ray_P, const float3 ray_D, const float ray_time)
ccl_device_forceinline void spot_light_mnee_sample_update(KernelGlobals kg, const ccl_global KernelLight *klight, ccl_private LightSample *ls, const float3 P, const float3 N, const uint32_t path_flag)
#define INTEGRATOR_STATE(state, nested_struct, member)
IntegratorStateCPU * IntegratorState
ccl_device void surface_shader_eval(KernelGlobals kg, ConstIntegratorGenericState state, ccl_private ShaderData *ccl_restrict sd, ccl_global float *ccl_restrict buffer, const uint32_t path_flag, bool use_caustics_storage=false)
ccl_device Spectrum surface_shader_background(const ccl_private ShaderData *sd)
ccl_device Spectrum surface_shader_emission(const ccl_private ShaderData *sd)
ccl_device bool surface_shader_constant_emission(KernelGlobals kg, const int shader, ccl_private Spectrum *eval)
ccl_device_noinline bool light_tree_sample(KernelGlobals kg, const float rand, const float3 P, float3 N_or_D, float t, const int object_receiver, const int shader_flags, ccl_private LightSample *ls)
ccl_device float light_tree_pdf(KernelGlobals kg, float3 P, float3 N, const float dt, const int path_flag, const int object_emitter, const uint index_emitter, const int object_receiver)
CCL_NAMESPACE_BEGIN struct Window V