22static_assert(
sizeof(ShaderClosure) >=
sizeof(
OrenNayarBsdf),
"OrenNayarBsdf is too large!");
31 if (cosTheta < 1e-6f) {
33 return (
M_PI_2_F - 2.0f / 3.0f) - cosTheta;
37 return sinTheta * (theta - 2.0f / 3.0f - sinTheta * cosTheta) +
38 2.0f / 3.0f * (sinTheta / cosTheta) * (1.0f -
sqr(sinTheta) * sinTheta);
47 const float nl =
max(
dot(n,
l), 0.0f);
48 if (bsdf->b <= 0.0f) {
51 const float nv =
max(
dot(n,
v), 0.0f);
52 float t =
dot(
l,
v) - nl * nv;
55 t /=
max(nl, nv) + FLT_MIN;
58 const float single_scatter = bsdf->a + bsdf->b * t;
61 const Spectrum multi_scatter = bsdf->multiscatter_term * (1.0f - El);
72 const float sigma =
saturatef(bsdf->roughness);
74 bsdf->b = sigma * bsdf->a;
78 const float Eavg = bsdf->a *
M_PI_F + ((
M_2PI_F - 5.6f) / 3.0f) * bsdf->b;
81 const float nv =
max(
dot(bsdf->N, sd->wi), 0.0f);
83 bsdf->multiscatter_term = Ems * (1.0f - Ev);
94 const float cosNO =
dot(bsdf->N, wo);
115 if (
dot(Ng, *wo) > 0.0f) {
MINLINE float safe_acosf(float a)
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert * v
ccl_device int bsdf_oren_nayar_sample(const ccl_private ShaderClosure *sc, const float3 Ng, const float3 wi, const float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device Spectrum bsdf_oren_nayar_eval(const ccl_private ShaderClosure *sc, const float3 wi, const float3 wo, ccl_private float *pdf)
ccl_device Spectrum bsdf_oren_nayar_get_intensity(const ccl_private ShaderClosure *sc, const float3 n, const float3 v, const float3 l)
ccl_device_inline float bsdf_oren_nayar_G(const float cosTheta)
ccl_device int bsdf_oren_nayar_setup(const ccl_private ShaderData *sd, ccl_private OrenNayarBsdf *bsdf, const Spectrum color)
dot(value.rgb, luminance_coefficients)") DEFINE_VALUE("REDUCE(lhs
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ CLOSURE_BSDF_OREN_NAYAR_ID
ccl_device_inline float sin_from_cos(const float c)
ccl_device_inline void sample_cos_hemisphere(const float3 N, const float2 rand_in, ccl_private float3 *wo, ccl_private float *pdf)
Spectrum multiscatter_term