00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "pbrt.h"
00026 #include "material.h"
00027
00028 class Glass : public Material {
00029 public:
00030
00031 Glass(Reference<Texture<Spectrum> > r, Reference<Texture<Spectrum> > t,
00032 Reference<Texture<float> > i, Reference<Texture<float> > bump) {
00033 Kr = r;
00034 Kt = t;
00035 index = i;
00036 bumpMap = bump;
00037 }
00038 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00039 private:
00040
00041 Reference<Texture<Spectrum> > Kr, Kt;
00042 Reference<Texture<float> > index;
00043 Reference<Texture<float> > bumpMap;
00044 };
00045
00046 BSDF *Glass::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00047
00048 DifferentialGeometry dgs;
00049 if (bumpMap)
00050 Bump(bumpMap, dgGeom, dgShading, &dgs);
00051 else
00052 dgs = dgShading;
00053 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00054 Spectrum R = Kr->Evaluate(dgs).Clamp();
00055 Spectrum T = Kt->Evaluate(dgs).Clamp();
00056 float ior = index->Evaluate(dgs);
00057 if (!R.Black())
00058 bsdf->Add(BSDF_ALLOC(SpecularReflection)(R,
00059 BSDF_ALLOC(FresnelDielectric)(1., ior)));
00060 if (!T.Black())
00061 bsdf->Add(BSDF_ALLOC(SpecularTransmission)(T, 1., ior));
00062 return bsdf;
00063 }
00064 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00065 const TextureParams &mp) {
00066 Reference<Texture<Spectrum> > Kr = mp.GetSpectrumTexture("Kr", Spectrum(1.f));
00067 Reference<Texture<Spectrum> > Kt = mp.GetSpectrumTexture("Kt", Spectrum(1.f));
00068 Reference<Texture<float> > index = mp.GetFloatTexture("index", 1.5f);
00069 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00070 return new Glass(Kr, Kt, index, bumpMap);
00071 }