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 Translucent : public Material {
00029 public:
00030
00031 Translucent(Reference<Texture<Spectrum> > kd, Reference<Texture<Spectrum> > ks,
00032 Reference<Texture<float> > rough,
00033 Reference<Texture<Spectrum> > refl,
00034 Reference<Texture<Spectrum> > trans,
00035 Reference<Texture<float> > bump) {
00036 Kd = kd;
00037 Ks = ks;
00038 roughness = rough;
00039 reflect = refl;
00040 transmit = trans;
00041 bumpMap = bump;
00042 }
00043 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00044 private:
00045
00046 Reference<Texture<Spectrum> > Kd, Ks;
00047 Reference<Texture<float> > roughness;
00048 Reference<Texture<Spectrum> > reflect, transmit;
00049 Reference<Texture<float> > bumpMap;
00050 };
00051
00052 BSDF *Translucent::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00053
00054 DifferentialGeometry dgs;
00055 if (bumpMap)
00056 Bump(bumpMap, dgGeom, dgShading, &dgs);
00057 else
00058 dgs = dgShading;
00059 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00060 Spectrum r = reflect->Evaluate(dgs).Clamp();
00061 Spectrum t = transmit->Evaluate(dgs).Clamp();
00062 if (r.Black() && t.Black()) return bsdf;
00063
00064 Spectrum kd = Kd->Evaluate(dgs).Clamp();
00065 if (!kd.Black()) {
00066 if (!r.Black()) bsdf->Add(BSDF_ALLOC(Lambertian)(r * kd));
00067 if (!t.Black()) bsdf->Add(BSDF_ALLOC(BRDFToBTDF)(BSDF_ALLOC(Lambertian)(t * kd)));
00068 }
00069 Spectrum ks = Ks->Evaluate(dgs).Clamp();
00070 if (!ks.Black()) {
00071 float rough = roughness->Evaluate(dgs);
00072 if (!r.Black()) {
00073 Fresnel *fresnel = BSDF_ALLOC(FresnelDielectric)(1.5f, 1.f);
00074 bsdf->Add(BSDF_ALLOC(Microfacet)(r * ks, fresnel,
00075 BSDF_ALLOC(Blinn)(1.f / rough)));
00076 }
00077 if (!t.Black()) {
00078 Fresnel *fresnel = BSDF_ALLOC(FresnelDielectric)(1.5f, 1.f);
00079 bsdf->Add(BSDF_ALLOC(BRDFToBTDF)(BSDF_ALLOC(Microfacet)(t * ks, fresnel,
00080 BSDF_ALLOC(Blinn)(1.f / rough))));
00081 }
00082 }
00083 return bsdf;
00084 }
00085 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00086 const TextureParams &mp) {
00087 Reference<Texture<Spectrum> > Kd = mp.GetSpectrumTexture("Kd", Spectrum(1.f));
00088 Reference<Texture<Spectrum> > Ks = mp.GetSpectrumTexture("Ks", Spectrum(1.f));
00089 Reference<Texture<Spectrum> > reflect = mp.GetSpectrumTexture("reflect", Spectrum(0.5f));
00090 Reference<Texture<Spectrum> > transmit = mp.GetSpectrumTexture("transmit", Spectrum(0.5f));
00091 Reference<Texture<float> > roughness = mp.GetFloatTexture("roughness", .1f);
00092 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00093 return new Translucent(Kd, Ks, roughness, reflect, transmit, bumpMap);
00094 }