28 if ((ls->prim !=
PRIM_NONE) &&
dot(ls->Ng, ls->D) > 0.0f) {
36 #ifdef __BACKGROUND_MIS__
58 ls->Ng = emission_sd->Ng;
66 shader_eval_surface<KERNEL_FEATURE_NODE_MASK_SURFACE_LIGHT>(
70 #ifdef __BACKGROUND_MIS__
85 eval *=
make_float3(klight->strength[0], klight->strength[1], klight->strength[2]);
102 const float rand_terminate)
108 if (
kernel_data.integrator.light_inv_rr_threshold > 0.0f) {
111 if (probability < 1.0f) {
112 if (rand_terminate >= probability) {
140 const float u = 1.0f - sd->u - sd->v;
141 const float v = sd->u;
142 const float w = sd->v;
151 float a =
dot(
N[2] -
N[0],
V[0] -
V[2]);
152 float b =
dot(
N[2] -
N[1],
V[1] -
V[2]);
153 float c =
dot(
N[1] -
N[0],
V[1] -
V[0]);
154 float h =
a * u * (u - 1) + (
a +
b +
c) * u *
v +
b *
v * (
v - 1);
157 if (
dot(n, Ng) > 0) {
162 h0 =
max(
dot(
V[0] -
P,
N[0]) + h0, 0.0f);
163 h1 =
max(
dot(
V[1] -
P,
N[1]) + h1, 0.0f);
164 h2 =
max(
dot(
V[2] -
P,
N[2]) + h2, 0.0f);
171 h0 =
max(
dot(
P -
V[0],
N[0]) + h0, 0.0f);
172 h1 =
max(
dot(
P -
V[1],
N[1]) + h1, 0.0f);
173 h2 =
max(
dot(
P -
V[2],
N[2]) + h2, 0.0f);
174 h =
min(-
min(
min(h0, h1), h2), h * 0.5f);
190 const float offset_cutoff =
195 if (offset_cutoff > 0.0f) {
197 const bool transmit = (
NL < 0.0f);
202 const float3 Ng = (transmit ? -sd->Ng : sd->Ng);
203 const float NgL =
dot(Ng,
L);
205 const float offset_amount = (
NL < offset_cutoff) ?
206 clamp(2.0f - (NgL +
NL) / offset_cutoff, 0.0f, 1.0f) :
207 clamp(1.0f - NgL / offset_cutoff, 0.0f, 1.0f);
209 if (offset_amount > 0.0f) {
214 *r_skip_self = (NgL > 0.0f);
226 const bool skip_self)
233 if (ls->t == FLT_MAX) {
253 ray->time = sd->time;
256 ray->self.object = (skip_self) ? sd->object :
OBJECT_NONE;
257 ray->self.prim = (skip_self) ? sd->prim :
PRIM_NONE;
258 ray->self.light_object = ls->object;
259 ray->self.light_prim = ls->prim;
269 bool skip_self =
true;
286 const float forward_pdf,
289 #ifdef WITH_CYCLES_DEBUG
303 const float forward_pdf)
305 #ifdef WITH_CYCLES_DEBUG
ccl_device_inline void bsdf_eval_mul(ccl_private BsdfEval *eval, float value)
ccl_device_inline bool bsdf_eval_is_zero(ccl_private BsdfEval *eval)
ccl_device_inline float3 bsdf_eval_sum(ccl_private const BsdfEval *eval)
__forceinline int reduce_max(const avxi &v)
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
#define kernel_assert(cond)
#define ccl_device_noinline_cpu
#define ccl_device_inline
#define CCL_NAMESPACE_END
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_nee(KernelGlobals kg, const float nee_pdf, const float forward_pdf)
CCL_NAMESPACE_BEGIN ccl_device_noinline_cpu float3 light_sample_shader_eval(KernelGlobals kg, IntegratorState state, ccl_private ShaderData *ccl_restrict emission_sd, ccl_private LightSample *ccl_restrict ls, float time)
ccl_device_inline float3 shadow_ray_offset(KernelGlobals kg, ccl_private const ShaderData *ccl_restrict sd, float3 L, ccl_private bool *r_skip_self)
ccl_device_inline void light_sample_to_volume_shadow_ray(KernelGlobals kg, ccl_private const ShaderData *ccl_restrict sd, ccl_private const LightSample *ccl_restrict ls, const float3 P, ccl_private Ray *ray)
ccl_device_inline float3 shadow_ray_smooth_surface_offset(KernelGlobals kg, ccl_private const ShaderData *ccl_restrict sd, float3 Ng)
ccl_device_inline void shadow_ray_setup(ccl_private const ShaderData *ccl_restrict sd, ccl_private const LightSample *ccl_restrict ls, const float3 P, ccl_private Ray *ray, const bool skip_self)
ccl_device_inline bool light_sample_is_light(ccl_private const LightSample *ccl_restrict ls)
ccl_device_inline void light_sample_to_surface_shadow_ray(KernelGlobals kg, ccl_private const ShaderData *ccl_restrict sd, ccl_private const LightSample *ccl_restrict ls, ccl_private Ray *ray)
ccl_device_inline bool light_sample_terminate(KernelGlobals kg, ccl_private const LightSample *ccl_restrict ls, ccl_private BsdfEval *ccl_restrict eval, const float rand_terminate)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
ccl_device_forceinline float differential_make_compact(const differential3 D)
ccl_device_forceinline float differential_zero_compact()
ccl_device_inline void object_dir_transform(KernelGlobals kg, ccl_private const ShaderData *sd, ccl_private float3 *D)
ccl_device float3 shader_emissive_eval(ccl_private const ShaderData *sd)
ccl_device float3 shader_background_eval(ccl_private const ShaderData *sd)
ccl_device bool shader_constant_emission_eval(KernelGlobals kg, int shader, ccl_private float3 *eval)
@ PRIMITIVE_MOTION_TRIANGLE
@ DIRECT_LIGHT_SAMPLING_NEE
@ DIRECT_LIGHT_SAMPLING_FORWARD
@ SD_OBJECT_TRANSFORM_APPLIED
#define PROFILING_INIT_FOR_SHADER(kg, event)
#define PROFILING_EVENT(event)
#define PROFILING_SHADER(object, shader)
ccl_device_inline float2 normalize_len(const float2 &a, float *t)
ccl_device_inline float2 fabs(const float2 &a)
ccl_device_inline float3 zero_float3()
ccl_device float power_heuristic(float a, float b)
ccl_device_inline void motion_triangle_vertices_and_normals(KernelGlobals kg, int object, int prim, float time, float3 verts[3], float3 normals[3])
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
T clamp(const T &a, const T &min, const T &max)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
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, int shader, int object, int prim, float u, float v, float t, float time, bool object_space, int 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)
IntegratorStateCPU *ccl_restrict IntegratorState
ccl_device_inline void triangle_vertices_and_normals(KernelGlobals kg, int prim, float3 P[3], float3 N[3])
@ PROFILING_SHADE_LIGHT_SETUP
@ PROFILING_SHADE_LIGHT_EVAL
CCL_NAMESPACE_BEGIN struct Window V