31 const float eta_cos_theta_t_sq =
sqr(eta) - (1.0f -
sqr(cos_theta_i));
32 if (eta_cos_theta_t_sq <= 0) {
48 cos_theta_i =
fabsf(cos_theta_i);
50 const float cos_theta_t = -
safe_sqrtf(eta_cos_theta_t_sq) / eta;
53 *r_cos_theta_t = cos_theta_t;
57 const float r_s = (cos_theta_i + eta * cos_theta_t) / (cos_theta_i - eta * cos_theta_t);
58 const float r_p = (cos_theta_t + eta * cos_theta_i) / (eta * cos_theta_i - cos_theta_t);
80 const float cos_theta_t,
83 return (inv_eta *
dot(normal, incident) + cos_theta_t) * normal - inv_eta * incident;
90 const float c =
fabsf(cosi);
91 float g = eta * eta - 1 + c * c;
94 const float A = (g - c) / (g + c);
95 const float B = (c * (g + c) - 1) / (c * (g - c) + 1);
96 return 0.5f *
A *
A * (1 +
B *
B);
109 return 0.997118f + eta * (0.1014f - eta * (0.965241f + eta * 0.130607f));
111 return (eta - 1.0f) / (4.08567f + 1.00071f * eta);
118 const Spectrum tmp_f = eta * eta + k * k;
120 const Spectrum Rparl2 = (tmp - (2.0f * eta * cosi) + one) / (tmp + (2.0f * eta * cosi) + one);
121 const Spectrum Rperp2 = (tmp_f - (2.0f * eta * cosi) + cosi2) /
122 (tmp_f + (2.0f * eta * cosi) + cosi2);
123 return (Rparl2 + Rperp2) * 0.5f;
141 const float f = 6.0f / 7.0f;
142 const float f5 =
sqr(
sqr(f)) * f;
144 return F_schlick * (7.0f / (f5 * f)) * (
one_spectrum() - tint);
150 const float f = 6.0f / 7.0f;
151 const float f5 =
sqr(
sqr(f)) * f;
153 return (7.0f / (f5 * f)) * (F_schlick - F82);
168 const float sqrt_f0 =
sqrtf(
clamp(f0, 0.0f, 0.99f));
169 return (1.0f + sqrt_f0) / (1.0f - sqrt_f0);
174 return sqr((ior - 1.0f) / (ior + 1.0f));
179 const float m =
clamp(1.0f - u, 0.0f, 1.0f);
180 const float m2 = m * m;
208 const float Iz =
dot(
I, Ng);
212 const float threshold =
min(0.9f * Iz, 0.01f);
213 if (
dot(Ng,
R) >= threshold) {
261 const float Ix =
dot(
I,
X);
263 const float a =
sqr(Ix) +
sqr(Iz);
264 const float b = 2.0f * (a + Iz * threshold);
265 const float c =
sqr(threshold + Iz);
270 const float Nz2 = (Ix < 0) ? 0.25f * (
b +
safe_sqrtf(
sqr(
b) - 4.0f * a * c)) / a :
276 return Nx *
X + Nz * Ng;
295 const float azimuthal_roughness)
297 const float x = azimuthal_roughness;
298 return (((((0.245f *
x) + 5.574f) *
x - 10.73f) *
x + 2.532f) *
x - 0.215f) *
x + 5.969f;
306 return sigma * sigma;
310 const float pheomelanin)
347 const float phase =
M_2PI_F * OPD * 1e-9f;
353 xyz.
x += 1.64408e-8f *
cosf(2.2399e+06f * phase + shift) *
expf(-4.5282e+09f *
sqr(phase));
354 return xyz / 1.0685e-7f;
358 const float T121,
const float R12,
const float R23,
const float OPD,
const float phi)
365 const float R123 = R12 * R23;
366 const float r123 =
sqrtf(R123);
367 const float Rs =
sqr(T121) * R23 / (1.0f - R123);
371 float Cm = (Rs - T121);
373 for (
int m = 1; m < 4; m++) {
385 const float thickness,
390 if (thickness < 30.0f) {
406 const float OPD = -2.0f * eta2 * thickness * cos_theta_2;
410 -cos_theta_2, eta3 / eta2, r_cos_theta_3, &phi23);
MINLINE float safe_sqrtf(float a)
ccl_device float3 maybe_ensure_valid_specular_reflection(ccl_private ShaderData *sd, const float3 N)
ccl_device_inline float3 iridescence_airy_summation(const float T121, const float R12, const float R23, const float OPD, const float phi)
ccl_device float ior_from_F0(const float f0)
ccl_device float fresnel_dielectric_cos(const float cosi, const float eta)
ccl_device float schlick_fresnel(const float u)
ccl_device float F0_from_ior(const float ior)
ccl_device_inline Spectrum bsdf_principled_hair_sigma_from_reflectance(const Spectrum color, const float azimuthal_roughness)
ccl_device Spectrum fresnel_conductor(const float cosi, const Spectrum eta, const Spectrum k)
ccl_device_inline float bsdf_principled_hair_albedo_roughness_scale(const float azimuthal_roughness)
ccl_device Spectrum fresnel_iridescence(KernelGlobals kg, float eta1, float eta2, float eta3, float cos_theta_1, const float thickness, ccl_private float *r_cos_theta_3)
ccl_device_inline Spectrum fresnel_f82_B(const Spectrum F0, const Spectrum F82)
ccl_device_inline Spectrum fresnel_f82_Fss(const Spectrum F0, const Spectrum B)
ccl_device_inline Spectrum fresnel_conductor_Fss(const Spectrum eta, const Spectrum k)
ccl_device_inline float fresnel_dielectric_Fss(const float eta)
ccl_device_forceinline float fresnel_dielectric(const float cos_theta_i, const float eta, ccl_private float *r_cos_theta_t)
ccl_device_inline Spectrum iridescence_lookup_sensitivity(const float OPD, const float shift)
ccl_device float3 ensure_valid_specular_reflection(const float3 Ng, const float3 I, float3 N)
ccl_device_inline Spectrum bsdf_principled_hair_sigma_from_concentration(const float eumelanin, const float pheomelanin)
ccl_device_inline float3 refract_angle(const float3 incident, const float3 normal, const float cos_theta_t, const float inv_eta)
ccl_device_forceinline Spectrum interpolate_fresnel_color(const float3 L, const float3 H, const float ior, Spectrum F0)
ccl_device_inline Spectrum closure_layering_weight(const Spectrum layer_albedo, const Spectrum weight)
ccl_device_inline Spectrum fresnel_f82tint_B(const Spectrum F0, const Spectrum tint)
CCL_NAMESPACE_BEGIN ccl_device float2 fresnel_dielectric_polarized(float cos_theta_i, const float eta, ccl_private float *r_cos_theta_t, ccl_private float2 *r_phi)
ccl_device_inline Spectrum safe_divide_color(Spectrum a, Spectrum b, const float fallback=0.0f)
reduce_max(value.rgb)") DEFINE_VALUE("REDUCE(lhs
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define kernel_assert(cond)
#define ccl_device_forceinline
const ThreadKernelGlobalsCPU * KernelGlobals
#define ccl_device_inline
#define CCL_NAMESPACE_END
constexpr T clamp(T, U, U) RET
@ SD_USE_BUMP_MAP_CORRECTION
ccl_device_inline Spectrum rgb_to_spectrum(const float3 rgb)
ccl_device_inline bool isnan_safe(const float f)
ccl_device_inline float sqr(const float a)
ccl_device_inline float inverse_lerp(const float a, const float b, const float x)
MINLINE float smoothstep(float edge0, float edge1, float x)
ccl_device_inline float2 one_float2()
CCL_NAMESPACE_BEGIN ccl_device_inline float2 zero_float2()
ccl_device_inline float average(const float2 a)
ccl_device_inline bool isequal(const float2 a, const float2 b)
ccl_device_inline float3 safe_normalize_fallback(const float3 a, const float3 fallback)
ccl_device_inline float3 one_float3()
color xyz_to_rgb(float x, float y, float z)