1#ifndef _BBM_LAFORTUNE_H_
2#define _BBM_LAFORTUNE_H_
55 if(bbm::none(mask))
return Spectrum(0);
60 Value fr = bbm::pow( bbm::max(bbm::dot(C, in*out), 0),
sharpness );
85 mask &= (xi[0] >= 0) && (xi[1] >= 0) && (xi[0] <= 1) && (xi[1] <= 1);
88 if(bbm::none(mask))
return sample;
91 Vec2d csp = bbm::cossin(xi[0] * Constants::Pi(2));
92 Value cosTheta = bbm::pow(xi[1], 1.0 / (
sharpness + 1));
93 Value sinTheta = bbm::safe_sqrt( 1.0 - cosTheta*cosTheta );
131 if(bbm::none(mask))
return 0;
135 Value cosAlpha = bbm::max(bbm::dot(bbm::normalize(C*out), in), 0);
154 Value normalization = bbm::pow( bbm::norm(C * out),
sharpness ) * Constants::Pi(2) / (
sharpness + 2);
All includes and helpers needed for declaring new bsdfmodels.
#define BBM_EXPORT_BSDFMODEL(BsdfModel)
Definition: bbm_fromstring.h:49
The Lafortune BRDF model. This implements the model in Eq. 4 in the original paper linked above:
Definition: lafortune.h:30
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 and out direction.
Definition: lafortune.h:46
BBM_ATTRIBUTES(albedo, Cxy, Cz, sharpness)
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 BSDF given a direction and two random variables.
Definition: lafortune.h:77
specular_sharpness< Value > sharpness
Definition: lafortune.h:165
bsdf_parameter< Value, bsdf_attr::SpecularParameter, 0.57735026919, std::numeric_limits< Scalar >::max(), std::numeric_limits< Scalar >::min()> Cz
Definition: lafortune.h:164
bsdf_parameter< symmetry_t< Symmetry, Value >, bsdf_attr::SpecularParameter, -0.57735026919, std::numeric_limits< Scalar >::max(), std::numeric_limits< Scalar >::min()> Cxy
Definition: lafortune.h:163
BBM_BSDF_FORWARD
Definition: lafortune.h:34
BBM_DEFAULT_CONSTRUCTOR(lafortune)
Default constructor.
Definition: lafortune.h:171
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: lafortune.h:151
specular_scale< Spectrum > albedo
Class Attributes.
Definition: lafortune.h:162
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: lafortune.h:122
static constexpr string_literal name
Definition: lafortune.h:33
bsdfmodel concept
Definition: bsdfmodel.h:33
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
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
symmetry_v
symmetry variants.
Definition: bsdf_symmetry.h:19
constexpr auto select(MASK &&mask, const A &a, const A &b)
Definition: backbone.h:255
mat3d< std::decay_t< T > > toGlobalShadingFrame(const vec3d< T > &normal)
Construct a local shading frame to global frame transformation given a normal direction.
Definition: shading_frame.h:26
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
Definition: string_literal.h:16