The spica renderer
bssrdf.h
1 #ifdef _MSC_VER
2 #pragma once
3 #endif
4 
5 #ifndef _SPICA_BSSRDF_H_
6 #define _SPICA_BSSRDF_H_
7 
8 #include <vector>
9 #include <memory>
10 
11 #include "core/core.hpp"
12 #include "core/render.hpp"
13 #include "core/common.h"
14 #include "core/spectrum.h"
15 #include "core/interpolation.h"
16 
17 #include "core/interaction.h"
18 #include "core/bxdf.h"
19 
20 namespace spica {
21 
25 class SPICA_EXPORTS BSSRDF {
26 public:
27  BSSRDF(const SurfaceInteraction& po, double eta);
28 
29  virtual Spectrum S(const SurfaceInteraction& pi,
30  const Vector3d& wi) const = 0;
31  virtual Spectrum sample(const Scene& scene, double rand1, const Point2d& rand2,
32  MemoryArena& arena, SurfaceInteraction* po,
33  double* pdf) const = 0;
34 
35 protected:
36  const SurfaceInteraction po_;
37  double eta_;
38 };
39 
43 class SPICA_EXPORTS SeparableBSSRDF : public BSSRDF {
44 public:
45  // Public methods
46  SeparableBSSRDF(const SurfaceInteraction& po, double eta,
47  const SubsurfaceMaterial* material);
48  Spectrum S(const SurfaceInteraction& pi, const Vector3d& wi) const override;
49  Spectrum sample(const Scene& scene, double rand1, const Point2d& rand2,
50  MemoryArena& arena, SurfaceInteraction* po,
51  double* pdf) const override;
52 
53  // Public virtual methods
54  virtual Spectrum Sp(const SurfaceInteraction& pi) const;
55  virtual Spectrum Sr(double r) const = 0;
56  virtual std::unique_ptr<DiffusionReflectance> Rd() const = 0;
57 
58 protected:
59  // Protected methods
60  Spectrum Sw(const Vector3d& w) const;
61  Spectrum sampleSp(const Scene& scene, double rand1, const Point2d& rand2,
62  MemoryArena& arena, SurfaceInteraction* pi,
63  double* pdf) const;
64  virtual double pdfSp(const SurfaceInteraction& isect) const;
65 
66  // Protected virtual methods
67  virtual double sampleSr(int ch, double rand) const = 0;
68  virtual double pdfSr(int ch, double r) const = 0;
69 
70 private:
71  // Private fields
72  const Normal3d normal_;
73  const Vector3d tangent_, binormal_;
74  const SubsurfaceMaterial* material_;
75 
76  // Friend
77  friend class SeparableBSSRDFAdapter;
78 };
79 
83 class SPICA_EXPORTS DiffuseBSSRDF : public SeparableBSSRDF {
84 public:
85  DiffuseBSSRDF(const SurfaceInteraction& po, const SubsurfaceMaterial* material,
86  double eta, const Spectrum& sigmaAbsorb,
87  const Spectrum& sigmaScatter, const CatmullRom2D& table);
88 
89  Spectrum Sr(double r) const override;
90 
91  inline int nIntervals() const { return table_.ys().size(); }
92  inline std::vector<double> radii() const { return table_.ys(); }
93  std::unique_ptr<DiffusionReflectance> Rd() const override;
94 
95 protected:
96  double sampleSr(int ch, double rand) const override;
97  double pdfSr(int ch, double r) const override;
98 
99 private:
100  // Private fields
101  const CatmullRom2D& table_;
102  Spectrum sigmaAbsorb_, sigmaScatter_;
103  double eta_;
104  Spectrum sigmaExt_, albedo_;
105 };
106 
110 class SeparableBSSRDFAdapter : public BxDF {
111 public:
112  explicit SeparableBSSRDFAdapter(const SeparableBSSRDF* bssrdf);
113 
114  Spectrum f(const Vector3d& wo, const Vector3d& wi) const override;
115 
116 private:
117  const SeparableBSSRDF* bssrdf_;
118 };
119 
120 class SPICA_EXPORTS DiffusionReflectance {
121 public:
122  DiffusionReflectance(double eta);
123  virtual Spectrum operator()(const Point3d& po, const Point3d& pi) const = 0;
124 
125  double Ft(const Vector3d& w) const;
126  double Fdr() const;
127 
128 protected:
129  double eta_;
130 };
131 
133 public:
134  DipoleDiffusionReflectance(const Spectrum &sigma_a, const Spectrum &sigmap_s,
135  float eta);
136 
137  Spectrum operator()(const Point3d& po, const Point3d& pi) const override;
138 
139 private:
140  double A_;
141  Spectrum zpos_, zneg_, sigmap_t_, sigma_tr_, alphap_;
142 };
143 
144 // -----------------------------------------------------------------------------
145 // BSSRDF utility functions
146 // -----------------------------------------------------------------------------
147 
148 SPICA_EXPORTS double FresnelMoment1(double eta);
149 SPICA_EXPORTS double FresnelMoment2(double eta);
150 
151 SPICA_EXPORTS
152 void subsurfaceFromDiffuse(const CatmullRom2D& table, const Spectrum& albedoEff,
153  const Spectrum& mfp, Spectrum* sigA, Spectrum* sigS);
154 
155 SPICA_EXPORTS
156 void computeBeamDiffusionBSSRDF(double g, double eta, CatmullRom2D* table,
157  int albedoDivide = 100, int radiusDivide = 64);
158 
159 } // namespace spica
160 
161 #endif // _SPICA_BSSRDF_H_
Definition: interaction.h:68
SeparableBSSRDF class.
Definition: bssrdf.h:43
RGB spectrum.
Definition: spectrum.h:18
Definition: bssrdf.h:120
Definition: interpolation.h:53
Definition: material.h:24
BSSRDF Interface.
Definition: bssrdf.h:25
Adapter for evaluating surface reflection part of BSSRDF.
Definition: bssrdf.h:110
Definition: bssrdf.h:132
The base class of BxDFs.
Definition: bxdf.h:45
Scene provides the interface for scene graph.
Definition: scene.h:23
Diffuse BSSRDF class.
Definition: bssrdf.h:83