68 if (rand_disk.
y < 0.5f) {
74 else if (rand_disk.
y < 0.75f) {
81 rand_disk.
y = (rand_disk.
y - 0.5f) * 4.0f;
90 rand_disk.
y = (rand_disk.
y - 0.75f) * 4.0f;
103 ray.P =
P + disk_N * disk_height + disk_P;
106 ray.tmax = 2.0f * disk_height;
121 scene_intersect_local(kg, &ray, &ss_isect,
object, &lcg_state, max_hits);
122 const int num_eval_hits =
min(ss_isect.num_hits, max_hits);
123 if (num_eval_hits == 0) {
132 float sum_weights = 0.0f;
134 for (
int hit = 0; hit < num_eval_hits; hit++) {
136 const int object = ss_isect.hits[hit].object;
138 float3 hit_Ng = ss_isect.Ng[hit];
154 const float3 hit_P = ray.P + ray.D * ss_isect.hits[hit].t;
157 const float pdf_N = pick_pdf_N *
fabsf(
dot(disk_N, hit_Ng));
158 const float pdf_T = pick_pdf_T *
fabsf(
dot(disk_T, hit_Ng));
159 const float pdf_B = pick_pdf_B *
fabsf(
dot(disk_B, hit_Ng));
164 float w = pdf_N / (
sqr(pdf_N) +
sqr(pdf_T) +
sqr(pdf_B));
165 if (ss_isect.num_hits > max_hits) {
166 w *= ss_isect.num_hits / (
float)max_hits;
170 const float r =
len(hit_P -
P);
173 const Spectrum weight = subsurface_disk_eval(radius, disk_r, r) *
w;
176 ss_isect.Ng[hit] = hit_Ng;
177 weights[hit] = weight;
181 if (sum_weights == 0.0f) {
187 const float r = rand_resample * sum_weights;
188 float partial_sum = 0.0f;
190 for (
int hit = 0; hit < num_eval_hits; hit++) {
191 const Spectrum weight = weights[hit];
193 const float next_sum = partial_sum + sample_weight;
197 const Spectrum resampled_weight = weight * sum_weights / sample_weight;
199 ss_isect.hits[0] = ss_isect.hits[hit];
200 ss_isect.Ng[0] = ss_isect.Ng[hit];
202 ray.P = ray.P + ray.D * ss_isect.hits[hit].t;
203 ray.D = ss_isect.Ng[hit];
212 partial_sum = next_sum;
ccl_device void bssrdf_sample(const Spectrum radius, float xi, ccl_private float *r, ccl_private float *h)
ccl_device_forceinline float bssrdf_pdf(const Spectrum radius, const float r)
ccl_device_forceinline Spectrum bssrdf_eval(const Spectrum radius, const float r)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
ccl_device_inline void sort_intersections_and_normals(ccl_private Intersection *hits, ccl_private float3 *Ng, uint num_hits)
ccl_device_inline T to_global(const float2 p, const T X, const T Y)
ccl_device_inline float2 polar_to_cartesian(const float r, const float phi)
#define kernel_data_fetch(name, index)
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_zero_compact()
VecBase< float, D > normalize(VecOp< float, D >) RET
ccl_device_inline bool object_negative_scale_applied(const int object_flag)
ccl_device_inline Transform object_fetch_transform_motion_test(KernelGlobals kg, const int object, const float time, ccl_private Transform *itfm)
ccl_device_forceinline void guiding_record_bssrdf_bounce(KernelGlobals kg, IntegratorState state, const float pdf, const float3 N, const float3 wo, const Spectrum weight, const Spectrum albedo)
@ PRNG_SUBSURFACE_DISK_RESAMPLE
@ PATH_RAY_SUBSURFACE_BACKFACING
@ SD_OBJECT_TRANSFORM_APPLIED
ccl_device_inline uint lcg_state_init(const uint rng_hash, const uint rng_offset, const uint sample, const uint scramble)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)
ccl_device_inline float path_state_rng_1D(KernelGlobals kg, const ccl_private RNGState *rng_state, const int dimension)
ccl_device_inline float2 path_state_rng_2D(KernelGlobals kg, const ccl_private RNGState *rng_state, const int dimension)
#define INTEGRATOR_STATE_WRITE(state, nested_struct, member)
#define INTEGRATOR_STATE(state, nested_struct, member)
IntegratorStateCPU * IntegratorState