1#ifndef _BBM_WARD_DUER_GEISLER_MORODER_H_
2#define _BBM_WARD_DUER_GEISLER_MORODER_H_
63 if(bbm::none(mask))
return Spectrum(0);
69 Value normalizationFactor = Constants::Pi(4) *
vec::x(r) *
vec::y(r) * bbm::pow(zH2, 2.0) / bbm::dot(H, H);
70 auto exponent = bbm::squared_norm(
vec::xy(H) / r) / zH2;
73 result *= bbm::exp(-exponent) / normalizationFactor;
#define BBM_EXPORT_BSDFMODEL(BsdfModel)
Definition: bbm_fromstring.h:49
The anisotropic Ward BSDF model.
Definition: ward.h:28
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: ward.h:79
specular_roughness< symmetry_t< Symmetry, Value > > roughness
Definition: ward.h:161
specular_scale< Spectrum > albedo
Definition: ward.h:160
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: ward.h:120
Spectrum reflectance(const Vec3d &, BsdfFlag component=bsdf_flag::All, unit_t=unit_t::Radiance, Mask mask=true) const
Return the (approximate) hemispherical reflectance of the BSDF.
Definition: ward.h:152
The anisotropic Ward-Duer-Geisler-Moroder BSDF model.
Definition: wardduergeislermoroder.h:31
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: wardduergeislermoroder.h:54
BBM_DEFAULT_CONSTRUCTOR(wardduergeislermoroder)
Default constructor.
Definition: wardduergeislermoroder.h:80
BBM_BSDF_FORWARD
Definition: wardduergeislermoroder.h:37
static constexpr string_literal name
Definition: wardduergeislermoroder.h:36
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 decltype(auto) y(bbm::vec3d< T > &v)
Definition: vec.h:23
constexpr decltype(auto) z(bbm::vec3d< T > &v)
Definition: vec.h:26
constexpr decltype(auto) x(bbm::vec3d< T > &v)
Definition: vec.h:20
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
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
Definition: string_literal.h:16
Implements: "Measuring and modeling anisotropic reflection" [Ward 1992]: https://doi....