27 float s =
sqrtf(3.0f * (1.0f - alpha_prime));
28 return 0.5f * alpha_prime * (1.0f +
expf(-fourthirdA * s)) *
expf(-s);
45 constexpr const int max_num_iterations = 12;
46 for (
int i = 0; i < max_num_iterations; ++i) {
47 xmid = 0.5f * (x0 + x1);
65 bssrdf->radius *= 0.25f * M_1_PI_F;
69 const float inv_eta = 1.0f /
bssrdf->ior;
70 const float F_dr = inv_eta * (-1.440f * inv_eta + 0.710f) + 0.668f + 0.0636f *
bssrdf->ior;
71 const float fourthirdA = (4.0f / 3.0f) * (1.0f + F_dr) /
93#define BURLEY_TRUNCATE 16.0f
94#define BURLEY_TRUNCATE_CDF 0.9963790093708328f
99 return 1.9f - A + 3.5f * (A - 0.8f) * (A - 0.8f);
106 return 0.25f * M_1_PI_F * r;
138 float exp_r_3_d =
expf(-r / (3.0f * d));
139 float exp_r_d = exp_r_3_d * exp_r_3_d * exp_r_3_d;
140 return (exp_r_d + exp_r_3_d) / (4.0f * d);
158 const float tolerance = 1e-6f;
159 const int max_iteration_count = 10;
167 r =
expf(xi * xi * 2.4f) - 1.0f;
174 for (
int i = 0; i < max_iteration_count; i++) {
175 float exp_r_3 =
expf(-r / 3.0f);
176 float exp_r = exp_r_3 * exp_r_3 * exp_r_3;
177 float f = 1.0f - 0.25f * exp_r - 0.75f * exp_r_3 - xi;
178 float f_ = 0.25f * exp_r + 0.25f * exp_r_3;
180 if (
fabsf(f) < tolerance || f_ == 0.0f) {
223 float sampled_radius;
228 sampled_radius = 0.0f;
233 if (channel_radius > 0.0f) {
234 const float next_sum =
sum + 1.0f;
237 sampled_radius = channel_radius;
279 bssrdf->sample_weight = sample_weight;
332 if (bssrdf_channels > 0) {
342 bssrdf->sample_weight = 0.0f;
MINLINE float safe_sqrtf(float a)
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
ccl_device_inline ccl_private ShaderClosure * bsdf_alloc(ccl_private ShaderData *sd, int size, Spectrum weight)
CCL_NAMESPACE_BEGIN ccl_device ccl_private ShaderClosure * closure_alloc(ccl_private ShaderData *sd, int size, ClosureType type, Spectrum weight)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ccl_device int bsdf_diffuse_setup(ccl_private DiffuseBsdf *bsdf)
ccl_device_forceinline float bssrdf_pdf(const Spectrum radius, float r)
ccl_device void bssrdf_setup_radius(ccl_private Bssrdf *bssrdf, const ClosureType type)
ccl_device_inline Spectrum bssrdf_burley_compatible_mfp(Spectrum r)
CCL_NAMESPACE_BEGIN struct Bssrdf Bssrdf
ccl_device_forceinline float bssrdf_burley_root_find(float xi)
ccl_device void bssrdf_sample(const Spectrum radius, float xi, ccl_private float *r, ccl_private float *h)
ccl_device float bssrdf_burley_pdf(const float d, float r)
ccl_device int bssrdf_setup(ccl_private ShaderData *sd, ccl_private Bssrdf *bssrdf, int path_flag, ClosureType type)
ccl_device_inline ccl_private Bssrdf * bssrdf_alloc(ccl_private ShaderData *sd, Spectrum weight)
ccl_device float bssrdf_num_channels(const Spectrum radius)
ccl_device_inline float bssrdf_burley_fitting(float A)
ccl_device float bssrdf_dipole_compute_alpha_prime(float rd, float fourthirdA)
#define BURLEY_TRUNCATE_CDF
ccl_device void bssrdf_burley_setup(ccl_private Bssrdf *bssrdf)
ccl_device float bssrdf_dipole_compute_Rd(float alpha_prime, float fourthirdA)
ccl_device void bssrdf_burley_sample(const float d, float xi, ccl_private float *r, ccl_private float *h)
ccl_device_forceinline Spectrum bssrdf_eval(const Spectrum radius, float r)
ccl_device float bssrdf_burley_eval(const float d, float r)
static T sum(const btAlignedObjectArray< T > &items)
#define ccl_device_forceinline
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ CLOSURE_BSSRDF_BURLEY_ID
@ CLOSURE_BSSRDF_RANDOM_WALK_ID
@ CLOSURE_BSSRDF_RANDOM_WALK_SKIN_ID
#define CLOSURE_WEIGHT_CUTOFF
@ PATH_RAY_DIFFUSE_ANCESTOR
#define BSSRDF_MIN_RADIUS
ccl_device_inline float average(const float2 a)
ccl_device_inline float reduce_add(const float2 a)
closure color bssrdf(string method, normal N, vector radius, color albedo) BUILTIN
#define SPECTRUM_CHANNELS
#define FOREACH_SPECTRUM_CHANNEL(counter)
#define GET_SPECTRUM_CHANNEL(v, i)
SPECTRUM_DATA_TYPE Spectrum
ccl_device_inline int clamp(int a, int mn, int mx)