00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PBRT_VOLUME_H
00025 #define PBRT_VOLUME_H
00026
00027 #include "pbrt.h"
00028 #include "color.h"
00029 #include "geometry.h"
00030 #include "paramset.h"
00031 #include "transform.h"
00032 #include "transport.h"
00033
00034 COREDLL float PhaseIsotropic(const Vector &w, const Vector &wp);
00035 COREDLL
00036 float PhaseRayleigh(const Vector &w, const Vector &wp);
00037 COREDLL
00038 float PhaseMieHazy(const Vector &w, const Vector &wp);
00039 COREDLL
00040 float PhaseMieMurky(const Vector &w, const Vector &wp);
00041 COREDLL float PhaseHG(const Vector &w, const Vector &wp, float g);
00042 COREDLL float PhaseSchlick(const Vector &w, const Vector &wp, float g);
00043 class COREDLL VolumeRegion {
00044 public:
00045
00046 virtual ~VolumeRegion() { }
00047 virtual BBox WorldBound() const = 0;
00048 virtual bool IntersectP(const Ray &ray, float *t0,
00049 float *t1) const = 0;
00050 virtual Spectrum sigma_a(const Point &,
00051 const Vector &) const = 0;
00052 virtual Spectrum sigma_s(const Point &,
00053 const Vector &) const = 0;
00054 virtual
00055 Spectrum Lve(const Point &, const Vector &) const = 0;
00056 virtual float p(const Point &, const Vector &,
00057 const Vector &) const = 0;
00058 virtual Spectrum sigma_t(const Point &, const Vector &) const;
00059 virtual Spectrum Tau(const Ray &ray,
00060 float step = 1.f, float offset = 0.5) const = 0;
00061 };
00062 class COREDLL DensityRegion : public VolumeRegion {
00063 public:
00064
00065 DensityRegion(const Spectrum &sig_a, const Spectrum &sig_s,
00066 float g, const Spectrum &Le, const Transform &VolumeToWorld);
00067 virtual float Density(const Point &Pobj) const = 0;
00068 Spectrum sigma_a(const Point &p, const Vector &) const {
00069 return Density(WorldToVolume(p)) * sig_a;
00070 }
00071 Spectrum sigma_s(const Point &p, const Vector &) const {
00072 return Density(WorldToVolume(p)) * sig_s;
00073 }
00074 Spectrum sigma_t(const Point &p, const Vector &) const {
00075 return Density(WorldToVolume(p)) * (sig_a + sig_s);
00076 }
00077 Spectrum Lve(const Point &p, const Vector &) const {
00078 return Density(WorldToVolume(p)) * le;
00079 }
00080 float p(const Point &p, const Vector &w,
00081 const Vector &wp) const {
00082 return PhaseHG(w, wp, g);
00083 }
00084 Spectrum Tau(const Ray &r, float stepSize, float offset) const;
00085 protected:
00086
00087 Transform WorldToVolume;
00088 Spectrum sig_a, sig_s, le;
00089 float g;
00090 };
00091 class COREDLL AggregateVolume : public VolumeRegion {
00092 public:
00093
00094 AggregateVolume(const vector<VolumeRegion *> &r);
00095 ~AggregateVolume();
00096 BBox WorldBound() const;
00097 bool IntersectP(const Ray &ray, float *t0, float *t1) const;
00098 Spectrum sigma_a(const Point &, const Vector &) const;
00099 Spectrum sigma_s(const Point &, const Vector &) const;
00100 Spectrum Lve(const Point &, const Vector &) const;
00101 float p(const Point &, const Vector &, const Vector &) const;
00102 Spectrum sigma_t(const Point &, const Vector &) const;
00103 Spectrum Tau(const Ray &ray, float, float) const;
00104 private:
00105
00106 vector<VolumeRegion *> regions;
00107 BBox bound;
00108 };
00109 class VolumeIntegrator : public Integrator {
00110 public:
00111 virtual Spectrum Transmittance(const Scene *scene,
00112 const Ray &ray, const Sample *sample,
00113 float *alpha) const = 0;
00114 };
00115 #endif // PBRT_VOLUME_H