38 template<
typename CONF, string_literal NAME=
"MerlData">
requires concepts::config<CONF>
89 if(bbm::none(mask))
return result;
95 return bbm::lookup<Spectrum>(
_data, index, bbm::cast<index_mask_t<Value>>(mask));
155 return bbm::select(mask, Spectrum(1), Spectrum(0));
173 inline void import(void)
176 std::ifstream ifs(
_filename, std::ios_base::binary);
179 uint32_t thetaH, thetaD, phiD;
180 ifs.read(
reinterpret_cast<char*
>(&thetaH),
sizeof(uint32_t));
181 ifs.read(
reinterpret_cast<char*
>(&thetaD),
sizeof(uint32_t));
182 ifs.read(
reinterpret_cast<char*
>(&phiD),
sizeof(uint32_t));
184 if(thetaH != 90 || thetaD != 90 || phiD != 180)
throw std::runtime_error(
"BBM: not a recognized MERL BRDF: " +
bbm::toString(
_filename));
190 size_t size = thetaH * thetaD * phiD;
191 auto buffer = std::make_unique<double[]>(3 *
size);
192 auto buffer_ref = buffer.get();
193 ifs.read(
reinterpret_cast<char *
>(buffer_ref), 3 *
size *
sizeof(
double));
199 for(
size_t idx=0; idx !=
size; ++idx)
200 _data.push_back( color<double>( bbm::max(0, buffer_ref[idx] * 1.0 / 1500.0),
201 bbm::max(0, buffer_ref[
size + idx] * 1.15 / 1500.0),
202 bbm::max(0, buffer_ref[2*
size + idx] * 1.66 / 1500.0)
All BBM methods are defined to operate on a variety of value types and spectrum types....
#define BBM_EXPORT_BSDFMODEL(BsdfModel)
Definition: bbm_fromstring.h:49
MERL-MIT sampled reflectance.
Definition: merl.h:40
std::vector< color< double > > _data
Definition: merl.h:213
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 given an in and out direction.
Definition: merl.h:78
merl_data(const merl_data &src)=default
Copy constructor.
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 sanpled BSDF given a direction and two random variables.
Definition: merl.h:108
std::string toString(void) const
Custom string conversion.
Definition: merl.h:161
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: merl.h:127
merl_linearizer< Config > _linearizer
Definition: merl.h:212
merl_data(void)=delete
Empty Constructor.
merl_data & operator=(const merl_data &src)=default
Assignment operator.
std::string _filename
Class members.
Definition: merl.h:211
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: merl.h:149
static constexpr string_literal name
Definition: merl.h:43
BBM_CONSTRUCTOR(merl_data, args, arg< const std::string &, "filename">)
Import Constructor.
Definition: merl.h:60
Definition: ndf_sampler.h:25
bsdfmodel concept
Definition: bsdfmodel.h:33
config concept
Definition: config.h:31
Predefined exceptions for common errors.
Defines additional helper methods for RGB colors.
The classic diffuse Lambertian BSDF model.
Macros for checking if a class meets a concept.
#define BBM_CHECK_CONCEPT(CONCEPTNAME, CLASSNAME,...)
Check a class for a concept with bbm::concepts::archetypes in the namespace.
Definition: macro.h:35
Linearize the sphere of in-out directions according to the encoding used in the MERL BRDF database.
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
size_t size(T &&t)
Definition: iterator_util.h:22
std::string toString(const T &)
toString alias
Definition: stringconvert.h:594
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
decltype(auto) value(T &&t)
return the value of an attribute, or if not an attribute the object
Definition: attribute_value.h:20
unit_t
Light Unit.
Definition: unit.h:21
Forward declaration of bbm::arg.
Definition: arg.h:27
Replaces a(n isotrpic) BSDF model's importance sampling with a data-driven NDF based sampler.
Methods for handling spherical coordinates.
Forward declaration.
Definition: args.h:248
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: merl_linearizer.h:23
Definition: string_literal.h:16