1#ifndef _BBM_STUDENT_T_NDF_H_
2#define _BBM_STUDENT_T_NDF_H_
47 if(bbm::none(mask))
return 0;
51 Value alpha2 = bbm::hprod(alpha);
56 return bbm::select(mask, bbm::rcp(normalization * denumerator), 0);
67 Vec3d
sample(
const Vec3d& ,
const Vec2d& xi, Mask mask=
true)
const
70 mask &= (xi[0] >= 0) && (xi[1] >= 0) && (xi[0] <= 1) && (xi[1] <= 1);
73 if(bbm::none(mask))
return 0;
76 Vec2d csp = bbm::cossin( Constants::Pi(2) * xi[0] );
81 normalization = bbm::rcp(bbm::squared_norm(csp /
roughness));
87 Value tanTheta2 = (bbm::pow(xi[1], 1.0/(1.0-
gamma)) - 1) * (
gamma-1) * normalization;
88 Value cosTheta = bbm::rsqrt(1.0 + tanTheta2);
89 Value sinTheta = bbm::safe_sqrt(1.0 - cosTheta*cosTheta);
103 Value
pdf(
const Vec3d& ,
const Vec3d& m, Mask mask=
true)
const
109 if(bbm::none(mask))
return 0;
132 Value
G1(
const Vec3d& v,
const Vec3d& m, Mask mask=
true)
const
135 mask &= (
vec::z(v) > 0) && (bbm::dot(v, m) > 0);
138 if(bbm::none(mask))
return 0;
141 auto normalMask = (
vec::z(v) < 1.0-Constants::Epsilon());
142 if(bbm::none(normalMask))
return 1.0;
146 Value z =
vec::z(v) * bbm::rsqrt( bbm::squared_norm(
vec::xy(v) * alpha) );
149 Value S1 = bbm::pow( (
gamma-1) + z*z, 3.0/2.0 -
gamma ) / z;
164 static inline Value
F21(
const Value& z)
166 Value z2 = z*z; Value z3 = z2*z;
167 Value numerator = 1.066*z + 2.655*z2 + 4.892*z3;
168 Value denumerator = 1.038 + 2.969*z + 4.305*z2 + 4.418*z3;
169 return (numerator / denumerator);
176 Value numerator = 14.402 - 27.145*
gamma + 20.574*gamma2 - 2.745*gamma3;
177 Value denumerator = -30.612 + 86.567*
gamma - 84.341*gamma2 + 29.938*gamma3;
178 return (numerator / denumerator);
185 Value numerator = -129.404 + 324.987*
gamma - 299.305*gamma2 + 93.268*gamma3;
186 Value denumerator = -92.609 + 256.006*
gamma - 245.663*gamma2 + 86.064*gamma3;
187 return (numerator / denumerator);
191 static inline Value
F24(
const Value& z)
193 Value z2 = z*z; Value z3 = z2*z;
194 Value numerator = 6.537 + 6.074*z - 0.623*z2 + 5.223*z3;
195 Value denumerator = 6.538 + 6.103*z - 3.218*z2 + 6.347*z3;
196 return (numerator / denumerator);
All includes and helpers needed for declaring new ndfs.
Definition: studentt.h:29
Value G1(const Vec3d &v, const Vec3d &m, Mask mask=true) const
Monodirectional shadowing and masking term.
Definition: studentt.h:132
static Value F24(const Value &z)
F24(z) (Eq. 23)
Definition: studentt.h:191
bsdf_parameter< Value, bsdf_attr::SpecularParameter, 2.0, 40.0, 1.5+Constants::Epsilon()> gamma
Definition: studentt.h:204
BBM_ATTRIBUTES(roughness, gamma)
Value pdf(const Vec3d &, const Vec3d &m, Mask mask=true) const
PDF of sampling the NDF.
Definition: studentt.h:103
Value eval(const Vec3d &halfway, Mask mask=true) const
Evaluate the NDF.
Definition: studentt.h:41
Vec3d sample(const Vec3d &, const Vec2d &xi, Mask mask=true) const
Sample the NDF.
Definition: studentt.h:67
BBM_DEFAULT_CONSTRUCTOR(studentt)
Default constructor.
Definition: studentt.h:210
static Value F23(const Value &gamma)
F23(gamma) (Eq. 23)
Definition: studentt.h:182
specular_roughness< symmetry_t< Symmetry, Value > > roughness
Definition: studentt.h:203
static Value F21(const Value &z)
F21(z) (Eq. 23)
Definition: studentt.h:164
static constexpr string_literal name
Definition: studentt.h:32
static Value F22(const Value &gamma)
F22(gamma) (Eq. 23)
Definition: studentt.h:173
ndf concept
Definition: ndf.h:29
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
T cosTheta(const vec2d< T > &v)
Definition: spherical.h:109
constexpr const vec3d< T > expand(const vec2d< T > &v, V &&a)
Definition: vec.h:55
constexpr decltype(auto) z(bbm::vec3d< T > &v)
Definition: vec.h:26
constexpr const vec2d< T > xy(const vec3d< T > &v)
Definition: vec.h:47
Definition: aggregatebsdf.h:29
symmetry_v
symmetry variants.
Definition: bsdf_symmetry.h:19
constexpr auto select(MASK &&mask, const A &a, const A &b)
Definition: backbone.h:255
vec3d< T > halfway(const vec3d< T > &a, const vec3d< T > &b)
Halfway vector (3D)
Definition: vec_transform.h:77
constexpr auto is_set(const FLAGNAME &a, const FLAG &flag)
Check if all in 'flag' are also set in 'a'; compatible with packet types.
Definition: flags.h:100
auto tgamma(const TA &a, const TX &x)
Unnormalized incomplete upper gamma function.
Definition: gamma.h:532
Base declaration of attribute; further specialized below.
Definition: attribute.h:26
Definition: string_literal.h:16