47 float3 disk_N, disk_T, disk_B;
48 float pick_pdf_N, pick_pdf_T, pick_pdf_B;
53 if (rand_disk.
y < 0.5f) {
59 else if (rand_disk.
y < 0.75f) {
66 rand_disk.
y = (rand_disk.
y - 0.5f) * 4.0f;
75 rand_disk.
y = (rand_disk.
y - 0.75f) * 4.0f;
80 float disk_height, disk_r;
84 float3 disk_P = (disk_r *
cosf(phi)) * disk_T + (disk_r *
sinf(phi)) * disk_B;
87 ray.P =
P + disk_N * disk_height + disk_P;
90 ray.tmax = 2.0f * disk_height;
106 scene_intersect_local(kg, &ray, &ss_isect,
object, &lcg_state, max_hits);
107 const int num_eval_hits =
min(ss_isect.num_hits, max_hits);
108 if (num_eval_hits == 0) {
117 float sum_weights = 0.0f;
119 for (
int hit = 0; hit < num_eval_hits; hit++) {
121 const int object = ss_isect.hits[hit].object;
123 float3 hit_Ng = ss_isect.Ng[hit];
139 const float3 hit_P = ray.P + ray.D * ss_isect.hits[hit].t;
142 const float pdf_N = pick_pdf_N *
fabsf(
dot(disk_N, hit_Ng));
143 const float pdf_T = pick_pdf_T *
fabsf(
dot(disk_T, hit_Ng));
144 const float pdf_B = pick_pdf_B *
fabsf(
dot(disk_B, hit_Ng));
149 float w = pdf_N / (
sqr(pdf_N) +
sqr(pdf_T) +
sqr(pdf_B));
150 if (ss_isect.num_hits > max_hits) {
151 w *= ss_isect.num_hits / (
float)max_hits;
155 const float r =
len(hit_P -
P);
158 const Spectrum weight = subsurface_disk_eval(radius, disk_r, r) *
w;
161 ss_isect.Ng[hit] = hit_Ng;
162 weights[hit] = weight;
166 if (sum_weights == 0.0f) {
172 const float r = rand_resample * sum_weights;
173 float partial_sum = 0.0f;
175 for (
int hit = 0; hit < num_eval_hits; hit++) {
176 const Spectrum weight = weights[hit];
178 float next_sum = partial_sum + sample_weight;
182 const Spectrum resampled_weight = weight * sum_weights / sample_weight;
184 ss_isect.hits[0] = ss_isect.hits[hit];
185 ss_isect.Ng[0] = ss_isect.Ng[hit];
187 ray.P = ray.P + ray.D * ss_isect.hits[hit].t;
188 ray.D = ss_isect.Ng[hit];
197 partial_sum = next_sum;
ccl_device_forceinline float bssrdf_pdf(const Spectrum radius, float r)
ccl_device void bssrdf_sample(const Spectrum radius, float xi, ccl_private float *r, ccl_private float *h)
ccl_device_forceinline Spectrum bssrdf_eval(const Spectrum radius, float r)
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
ccl_device_inline void sort_intersections_and_normals(ccl_private Intersection *hits, ccl_private float3 *Ng, uint num_hits)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_device_inline
#define CCL_NAMESPACE_END
ccl_device_forceinline float differential_zero_compact()
draw_view in_light_buf[] float
ccl_device_inline bool object_negative_scale_applied(const int object_flag)
ccl_device_inline Transform object_fetch_transform_motion_test(KernelGlobals kg, int object, 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 float average(const float2 a)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float path_state_rng_1D(KernelGlobals kg, ccl_private const RNGState *rng_state, const int dimension)
ccl_device_inline float2 path_state_rng_2D(KernelGlobals kg, ccl_private const RNGState *rng_state, const int dimension)
IntegratorStateCPU *ccl_restrict IntegratorState
#define INTEGRATOR_STATE_WRITE(state, nested_struct, member)
#define INTEGRATOR_STATE(state, nested_struct, member)
SPECTRUM_DATA_TYPE Spectrum
ccl_device_inline float sqr(float a)
ccl_device_inline void make_orthonormals(const float3 N, ccl_private float3 *a, ccl_private float3 *b)