37 if (rand_bsdf.
x < 0.5f) {
43 rand_bsdf.
x = 2.0f * (rand_bsdf.
x - 0.5f);
46 const float cos_NI =
dot(
bssrdf->N, sd->wi);
54 const float alpha =
bssrdf->alpha;
55 const float neta = 1.0f /
bssrdf->ior;
60 const float3 H =
X * local_H.
x +
Y * local_H.
y + Z * local_H.
z;
62 const float cos_HI =
dot(
H, sd->wi);
63 const float arg = 1.0f - (
sqr(neta) * (1.0f -
sqr(cos_HI)));
67 const float dnp =
max(
sqrtf(arg), 1e-7f);
68 const float nK = (neta * cos_HI) - dnp;
69 *wo = -(neta * sd->wi) + (nK *
H);
118 if (!subsurface_entry_bounce(kg,
bssrdf, sd, &rng_state, &wo) ||
dot(sd->Ng, wo) >= 0.0f) {
158 N = surface_shader_bssrdf_normal(sd);
162 sd->flag &= ~SD_CLOSURE_FLAGS;
186 if (!subsurface_random_walk(kg,
state, rng_state, ray, ss_isect)) {
191 if (!subsurface_disk(kg,
state, rng_state, ray, ss_isect)) {
213 ray.P += ray.D * ray.tmax * 2.0f;
225 const bool use_caustics =
kernel_data.integrator.use_caustics &&
236 else if (use_raytrace_kernel) {
ccl_device_inline ccl_private ShaderClosure * bsdf_alloc(ccl_private ShaderData *sd, int size, Spectrum weight)
ccl_device int bsdf_diffuse_setup(ccl_private DiffuseBsdf *bsdf)
ccl_device_forceinline float3 microfacet_ggx_sample_vndf(const float3 wi, const float alpha_x, const float alpha_y, const float2 rand)
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
ccl_device_forceinline int intersection_get_object_flags(KernelGlobals kg, ccl_private const Intersection *ccl_restrict isect)
ccl_device_forceinline int intersection_get_shader(KernelGlobals kg, ccl_private const Intersection *ccl_restrict isect)
#define kernel_assert(cond)
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define kernel_data_fetch(name, index)
#define ccl_optional_struct_init
#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_NAMESPACE_BEGIN ccl_device void integrator_volume_stack_update_for_subsurface(KernelGlobals kg, IntegratorState state, const float3 from_P, const float3 to_P)
ccl_device_forceinline void guiding_record_bssrdf_weight(KernelGlobals kg, IntegratorState state, const Spectrum weight, const Spectrum albedo)
@ CLOSURE_BSSRDF_BURLEY_ID
@ CLOSURE_BSSRDF_RANDOM_WALK_SKIN_ID
@ PATH_RAY_SUBSURFACE_BACKFACING
@ PATH_RAY_SUBSURFACE_DISK
@ PATH_RAY_DIFFUSE_ANCESTOR
@ PATH_RAY_SUBSURFACE_RANDOM_WALK
@ SD_OBJECT_INTERSECTS_VOLUME
#define KERNEL_FEATURE_LIGHT_PASSES
@ LABEL_SUBSURFACE_SCATTER
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE
@ DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_RAYTRACE
@ DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE_MNEE
ccl_device_inline float2 path_state_rng_2D(KernelGlobals kg, ccl_private const RNGState *rng_state, const int dimension)
ccl_device_inline void path_state_rng_load(ConstIntegratorState state, ccl_private RNGState *rng_state)
ccl_device_inline void sample_cos_hemisphere(const float3 N, float2 rand_in, ccl_private float3 *wo, ccl_private float *pdf)
IntegratorStateCPU *ccl_restrict IntegratorState
#define INTEGRATOR_STATE_WRITE(state, nested_struct, member)
#define INTEGRATOR_STATE(state, nested_struct, member)
ccl_device_forceinline void integrator_path_next_sorted(KernelGlobals kg, IntegratorState state, const DeviceKernel current_kernel, const DeviceKernel next_kernel, const uint32_t key)
ccl_device_forceinline void integrator_state_write_isect(IntegratorState state, ccl_private const Intersection *ccl_restrict isect)
CCL_NAMESPACE_BEGIN ccl_device_forceinline void integrator_state_write_ray(IntegratorState state, ccl_private const Ray *ccl_restrict ray)
closure color bssrdf(string method, normal N, vector radius, color albedo) BUILTIN
struct Intersection hits[LOCAL_MAX_HITS]
ccl_device_inline Spectrum surface_shader_bssrdf_sample_weight(ccl_private const ShaderData *ccl_restrict sd, ccl_private const ShaderClosure *ccl_restrict bssrdf_sc)
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)