1#ifndef _BBM_ORENNAYAR_H_
2#define _BBM_ORENNAYAR_H_
25 template<
typename CONF, string_literal NAME=
"OrenNayar">
requires concepts::config<CONF>
52 if(bbm::none(mask))
return Spectrum(0);
56 Value A = 1 - 0.5 * sigma2 / (sigma2 + 0.33);
57 Value B = 0.45 * sigma2 / (sigma2 + 0.09);
79 auto factor = A + (B * bbm::max(dot_xy, 0) / cosBeta);
82 Spectrum result =
albedo / Constants::Pi() * factor;
All includes and helpers needed for declaring new bsdfmodels.
#define BBM_EXPORT_BSDFMODEL(BsdfModel)
Definition: bbm_fromstring.h:49
The Oren-Nayar BSDF microfacet model for diffuse surfaces.
Definition: orennayar.h:27
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: orennayar.h:43
diffuse_scale< Spectrum > albedo
Class Attributes.
Definition: orennayar.h:141
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: orennayar.h:101
BBM_DEFAULT_CONSTRUCTOR(orennayar)
Default constructor.
Definition: orennayar.h:148
BBM_BSDF_FORWARD
Definition: orennayar.h:31
Value pdf(const Vec3d &in, const Vec3d &out, BsdfFlag component=bsdf_flag::All, unit_t unit=unit_t::Radiance, Mask mask=true) const
Compute the pdf given an in and out direction.
Definition: orennayar.h:117
BBM_ATTRIBUTES(albedo, roughness)
diffuse_roughness< Value > roughness
Definition: orennayar.h:142
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: orennayar.h:132
static constexpr string_literal name
Definition: orennayar.h:30
bsdfmodel concept
Definition: bsdfmodel.h:33
The classic diffuse Lambertian BSDF model.
#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 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
Definition: aggregatebsdf.h:29
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
Base declaration of attribute; further specialized below.
Definition: attribute.h:26
The classic diffuse Lambertian BSDF model.
Definition: lambertian.h:24
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 diffuse BSDF given a direction and two random variables.
Definition: lambertian.h:76
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: lambertian.h:115
Definition: string_literal.h:16