43 template<
typename CONF,
66 if(bbm::none(mask))
return 0;
70 Value tanTheta2 = (1 - cosTheta2) / cosTheta2;
73 Value D = normalization * bbm::exp( -bbm::pow( tanTheta2 / beta2,
p ) ) / (cosTheta2*cosTheta2);
87 Vec3d
sample(
const Vec3d& ,
const Vec2d& xi, Mask mask=
true)
const
90 mask &= (xi[0] >= 0) && (xi[1] >= 0) && (xi[0] <= 1) && (xi[1] <= 1);
93 if(bbm::none(mask))
return 0;
96 Vec2d csp = bbm::cossin( Constants::Pi(2) * xi[0] );
97 Value inv_p = bbm::rcp(
p);
99 Value cosTheta = bbm::rsqrt(1.0 + tanTheta2);
100 Value sinTheta = bbm::safe_sqrt(1.0 - cosTheta*cosTheta);
115 Value
pdf(
const Vec3d& ,
const Vec3d& m, Mask mask=
true)
const
121 if(bbm::none(mask))
return 0;
142 Value
G1(
const Vec3d& v,
const Vec3d& m, Mask mask=
true)
const
145 mask &= (
vec::z(v) > 0) && (bbm::dot(v, m) > 0);
148 if(bbm::none(mask))
return 0;
162 Mask mask =
p > Constants::Epsilon();
163 if(bbm::none(mask))
return result;
All includes and helpers needed for declaring new ndfs.
Exponential Power Distribution.
Definition: epd.h:48
Value G1(const Vec3d &v, const Vec3d &m, Mask mask=true) const
Monodirectional shadowing and masking term.
Definition: epd.h:142
BBM_DEFAULT_CONSTRUCTOR(epd)
Default constructor.
Definition: epd.h:188
bsdf_parameter< Value, bsdf_attr::SpecularParameter, 0.003, 0.5, 0.0 > beta
Definition: epd.h:181
Value pdf(const Vec3d &, const Vec3d &m, Mask mask=true) const
PDF of sampling the NDF.
Definition: epd.h:115
bsdf_parameter< Value, bsdf_attr::SpecularParameter, 0.2, 5.0, 0.0 > p
Definition: epd.h:182
Value eval(const Vec3d &halfway, Mask mask=true) const
Evaluate the NDF.
Definition: epd.h:60
Vec3d sample(const Vec3d &, const Vec2d &xi, Mask mask=true) const
Sample the NDF.
Definition: epd.h:87
Value compute_normalization(void) const
EPD normalization.
Definition: epd.h:157
static constexpr string_literal name
Definition: epd.h:51
config concept
Definition: config.h:31
ndf concept
Definition: ndf.h:29
Packet-type friendly implementation of:
Packet friendly computation of the the inverse of the incomplete gamma functions:
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
epd_normalization
EPD variants: compute the noralization on the fly or use precomputed values.
Definition: epd.h:29
static const tab< float, std::array{256}, decltype([](const auto &p) { return p *256.0/5.0;}) > distributionNormalization
Definition: distributionNormalization.h:16
static const tab< float, std::array{100, 1000}, decltype([](const auto &p) { return 5.0/p - 1.0;}), decltype([](const auto &t) { return bbm::exp(-bbm::exp(bbm::log(bbm::rcp(t)) *0.05)) *1000.0 - 1.0;}) > G1
Definition: G1.h:17
T cosTheta(const vec2d< T > &v)
Definition: spherical.h:109
T tanTheta(const vec2d< T > &v)
Definition: spherical.h:177
bbm::value_t< V > cosTheta2(const V &v)
Definition: spherical.h:115
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
Definition: aggregatebsdf.h:29
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
auto gamma_q_inv(const TA &a, const TQ &q)
the inverse of the normalized lower incomplete gamma function
Definition: invgamma.h:447
constexpr decltype(auto) get(T &&src)
Definition: named.h:317
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