1#ifndef _BBM_MICROFACET_H_
2#define _BBM_MICROFACET_H_
51 template<
typename NDF,
52 typename MaskingShadowing,
83 if(bbm::none(mask))
return Spectrum(0);
87 Value inh = bbm::dot(in, h);
88 Value outh = bbm::dot(out, h);
91 auto D =
ndf.eval(h, mask);
94 auto G = MaskingShadowing::eval(
ndf, in, out, h, mask);
97 auto F = Fresnel::eval(
eta, Value(0.5) * (inh + outh), mask);
100 Spectrum result = D * G * F / NormalizationFactor / (
vec::z(in) *
vec::z(out));
123 mask &= (xi[0] >= 0) && (xi[1] >= 0) && (xi[0] <= 1) && (xi[1] <= 1);
126 mask &= (
vec::z(out) > 0);
129 if(bbm::none(mask))
return sample;
132 Vec3d normal_m =
ndf.sample(out, xi, mask);
163 if(bbm::none(mask))
return 0;
170 auto pdf =
ndf.pdf(out, h, mask) / (4.0 * bbm::abs(bbm::dot( out, h )) );
192 mask &= (
vec::z(out) > 0);
195 if(bbm::none(mask))
return 0;
198 return Fresnel::eval(
eta.value(),
vec::z(out), mask) / NormalizationFactor * 4.0;
All includes and helpers needed for declaring new bsdfmodels.
bsdfmodel concept
Definition: bsdfmodel.h:33
fresnel concept
Definition: fresnel.h:27
maskingshadowing concept
Definition: maskingshadowing.h:24
matching_config concept
Definition: config.h:63
ndf concept
Definition: ndf.h:29
Joint Masking-Shadowing Functor concept.
Microfacet Normal Distribution contract.
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
constexpr decltype(auto) attributes(T &&t)
Definition: reflection.h:200
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
vec3d< T > reflect(const vec3d< T > &v, const vec3d< T > &normal)
Reflects a 3D vector.
Definition: vec_transform.h:44
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
unit_t
Light Unit.
Definition: unit.h:21
Base declaration of attribute; further specialized below.
Definition: attribute.h:26
static constexpr T Pi(T scale=1)
Definition: constants.h:19
Predefined normalization factors.
Definition: microfacet.h:32
static constexpr literal Cook
Definition: microfacet.h:35
static constexpr literal Walter
Definition: microfacet.h:34
static constexpr literal Unnormalized
Definition: microfacet.h:33
General microfacet BRDF model.
Definition: microfacet.h:58
Spectrum eval(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t=unit_t::Radiance, Mask mask=true) const
Evaluate the BSDF for a given in-out direction pair.
Definition: microfacet.h:74
BsdfSample sample(const Vec3d &out, const Vec2d &xi, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
Sample the microfacet BSDF given a direction and two random variables.
Definition: microfacet.h:115
BBM_BSDF_FORWARD
Definition: microfacet.h:61
BBM_ATTRIBUTES(reflection::attributes(ndf), eta)
BBM_DEFAULT_CONSTRUCTOR(microfacet)
Default constructor.
Definition: microfacet.h:211
Spectrum reflectance(const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t=unit_t::Radiance, Mask mask=true) const
Return the (approximate) hemispherical reflectance of the BSDF.
Definition: microfacet.h:186
fresnel_parameter< typename std::decay_t< Fresnel >::parameter_type > eta
Definition: microfacet.h:205
Value pdf(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t=unit_t::Radiance, Mask mask=true) const
Compute the pdf given an in and out direction.
Definition: microfacet.h:154
NDF ndf
Definition: microfacet.h:204
static constexpr string_literal name
Definition: microfacet.h:60
Definition: string_literal.h:16