SPH
Brdf.h
Go to the documentation of this file.
1 #pragma once
2 
4 
6 
7 class IBrdf : public Polymorphic {
8 public:
9  virtual Float transport(const Vector& normal, const Vector& dir_in, const Vector& dir_out) const = 0;
10 };
11 
12 class LambertBrdf : public IBrdf {
13 private:
14  Float albedo;
15 
16 public:
17  explicit LambertBrdf(const Float albedo)
18  : albedo(albedo) {}
19 
20  virtual Float transport(const Vector& UNUSED(normal),
21  const Vector& UNUSED(dir_in),
22  const Vector& UNUSED(dir_out)) const override {
23  return albedo / PI;
24  }
25 };
26 
27 class PhongBrdf : public IBrdf {
28 private:
29  Float albedo;
30  Float alpha = 2._f;
31 
32 public:
33  explicit PhongBrdf(const Float albedo)
34  : albedo(albedo) {}
35 
36  virtual Float transport(const Vector& normal,
37  const Vector& dir_in,
38  const Vector& dir_out) const override {
39  const Vector out = 2._f * dot(normal, dir_in) * normal - dir_in;
40  return albedo / PI + 0.3_f * pow(abs(dot(out, dir_out)), alpha);
41  }
42 };
43 
44 struct HapkeParams {
49 };
50 
51 class HapkeBrdf : public IBrdf {
52 private:
53  Float albedo;
54  Float Aw;
55  Float r0;
56  Float B0;
57  Float h;
58  Float g;
59  Float theta_bar;
60 
61 public:
62  virtual Float transport(const Vector& normal,
63  const Vector& dir_in,
64  const Vector& dir_out) const override {
65  const Float mu_i = dot(normal, dir_in);
66  const Float mu_e = dot(normal, dir_out);
67  SPH_ASSERT(mu_i > 0._f && mu_e > 0._f, mu_i, mu_e);
69  const Float alpha = 0._f;
70  return albedo / (mu_i + mu_e) * ((1._f + B(alpha)) * P(alpha) + H(mu_i) * H(mu_e) - 1._f) *
71  S(theta_bar);
72  }
73 
74 private:
75  INLINE Float B(const Float alpha) const {
76  return B0 / (1._f + tan(0.5_f * alpha) / h);
77  }
78 
79  INLINE Float P(const Float alpha) const {
80  return (1._f - sqr(g)) / pow(1._f + 2._f * g * cos(alpha) + sqr(g), 1.5_f);
81  }
82 
83  INLINE Float H(const Float mu) const {
84  return 1._f - Aw * mu / (r0 + 0.5_f * (1._f - 2._f * r0 * mu) * log((1._f + mu) / mu));
85  }
86 
87  INLINE Float S(const Float theta) const {
89  return theta;
90  }
91 };
92 
#define SPH_ASSERT(x,...)
Definition: Assert.h:94
#define NOT_IMPLEMENTED
Helper macro marking missing implementation.
Definition: Assert.h:100
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
double Float
Precision used withing the code. Use Float instead of float or double where precision is important.
Definition: Globals.h:13
constexpr INLINE T sqr(const T &f) noexcept
Return a squared value.
Definition: MathUtils.h:67
INLINE T cos(const T f)
Definition: MathUtils.h:291
constexpr INLINE Float pow(const Float v)
Power for floats.
INLINE T tan(const T f)
Definition: MathUtils.h:301
INLINE auto abs(const T &f)
Definition: MathUtils.h:276
constexpr Float PI
Mathematical constants.
Definition: MathUtils.h:361
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define UNUSED(x)
Definition: Object.h:37
#define NAMESPACE_SPH_END
Definition: Object.h:12
Basic vector algebra. Computations are accelerated using SIMD.
INLINE float dot(const BasicVector< float > &v1, const BasicVector< float > &v2)
Make sure the vector is trivially constructible and destructible, needed for fast initialization of a...
Definition: Vector.h:548
Definition: Brdf.h:51
virtual Float transport(const Vector &normal, const Vector &dir_in, const Vector &dir_out) const override
Definition: Brdf.h:62
Definition: Brdf.h:7
virtual Float transport(const Vector &normal, const Vector &dir_in, const Vector &dir_out) const =0
virtual Float transport(const Vector &UNUSED(normal), const Vector &UNUSED(dir_in), const Vector &UNUSED(dir_out)) const override
Definition: Brdf.h:20
LambertBrdf(const Float albedo)
Definition: Brdf.h:17
Definition: Brdf.h:27
virtual Float transport(const Vector &normal, const Vector &dir_in, const Vector &dir_out) const override
Definition: Brdf.h:36
PhongBrdf(const Float albedo)
Definition: Brdf.h:33
Float h
Definition: Brdf.h:46
Float B0
Definition: Brdf.h:45
Float theta_bar
Definition: Brdf.h:48
Float g
Definition: Brdf.h:47
Base class for all polymorphic objects.
Definition: Object.h:88