27 if (cosTheta < 1e-6f) {
29 return (
M_PI_2_F - 2.0f / 3.0f) - cosTheta;
33 return sinTheta * (theta - 2.0f / 3.0f - sinTheta * cosTheta) +
34 2.0f / 3.0f * (sinTheta / cosTheta) * (1.0f -
sqr(sinTheta) * sinTheta);
43 float nl =
max(
dot(n,
l), 0.0f);
44 float nv =
max(
dot(n,
v), 0.0f);
45 float t =
dot(
l,
v) - nl * nv;
48 t /=
max(nl, nv) + FLT_MIN;
50 const float single_scatter = bsdf->a + bsdf->b * t;
53 const Spectrum multi_scatter = bsdf->multiscatter_term * (1.0f - El);
64 const float sigma =
saturatef(bsdf->roughness);
66 bsdf->b = sigma * bsdf->a;
70 const float Eavg = bsdf->a *
M_PI_F + ((
M_2PI_F - 5.6f) / 3.0f) * bsdf->b;
71 const Spectrum Ems = M_1_PI_F *
sqr(albedo) * (Eavg / (1.0f - Eavg)) /
73 const float nv =
max(
dot(bsdf->N, sd->wi), 0.0f);
75 bsdf->multiscatter_term = Ems * (1.0f - Ev);
86 const float cosNO =
dot(bsdf->N, wo);
88 *pdf = cosNO * M_1_PI_F;
109 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_NAMESPACE_BEGIN struct OrenNayarBsdf OrenNayarBsdf
ccl_device Spectrum bsdf_oren_nayar_get_intensity(ccl_private const ShaderClosure *sc, float3 n, float3 v, float3 l)
ccl_device int bsdf_oren_nayar_setup(ccl_private const ShaderData *sd, ccl_private OrenNayarBsdf *bsdf, const Spectrum color)
ccl_device int bsdf_oren_nayar_sample(ccl_private const ShaderClosure *sc, float3 Ng, float3 wi, float2 rand, ccl_private Spectrum *eval, ccl_private float3 *wo, ccl_private float *pdf)
ccl_device Spectrum bsdf_oren_nayar_eval(ccl_private const ShaderClosure *sc, const float3 wi, const float3 wo, ccl_private float *pdf)
ccl_device_inline float bsdf_oren_nayar_G(const float cosTheta)
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
#define ccl_device_inline
#define CCL_NAMESPACE_END
@ CLOSURE_BSDF_OREN_NAYAR_ID
ccl_device_inline void sample_cos_hemisphere(const float3 N, float2 rand_in, ccl_private float3 *wo, ccl_private float *pdf)
Spectrum multiscatter_term
SPECTRUM_DATA_TYPE Spectrum
ccl_device_inline float sqr(float a)
ccl_device_inline float sin_from_cos(const float c)