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 Substrate : public Material {
00029 public:
00030
00031 Substrate(Reference<Texture<Spectrum> > kd, Reference<Texture<Spectrum> > ks,
00032 Reference<Texture<float> > u, Reference<Texture<float> > v,
00033 Reference<Texture<float> > bump) {
00034 Kd = kd;
00035 Ks = ks;
00036 nu = u;
00037 nv = v;
00038 bumpMap = bump;
00039 }
00040 BSDF *GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const;
00041 private:
00042
00043 Reference<Texture<Spectrum> > Kd, Ks;
00044 Reference<Texture<float> > nu, nv;
00045 Reference<Texture<float> > bumpMap;
00046 };
00047
00048 BSDF *Substrate::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading) const {
00049
00050 DifferentialGeometry dgs;
00051 if (bumpMap)
00052 Bump(bumpMap, dgGeom, dgShading, &dgs);
00053 else
00054 dgs = dgShading;
00055 BSDF *bsdf = BSDF_ALLOC(BSDF)(dgs, dgGeom.nn);
00056 Spectrum d = Kd->Evaluate(dgs).Clamp();
00057 Spectrum s = Ks->Evaluate(dgs).Clamp();
00058 float u = nu->Evaluate(dgs);
00059 float v = nv->Evaluate(dgs);
00060
00061 bsdf->Add(BSDF_ALLOC(FresnelBlend)(d, s, BSDF_ALLOC(Anisotropic)(1.f/u, 1.f/v)));
00062 return bsdf;
00063 }
00064 extern "C" DLLEXPORT Material * CreateMaterial(const Transform &xform,
00065 const TextureParams &mp) {
00066 Reference<Texture<Spectrum> > Kd = mp.GetSpectrumTexture("Kd", Spectrum(.5f));
00067 Reference<Texture<Spectrum> > Ks = mp.GetSpectrumTexture("Ks", Spectrum(.5f));
00068 Reference<Texture<float> > uroughness = mp.GetFloatTexture("uroughness", .1f);
00069 Reference<Texture<float> > vroughness = mp.GetFloatTexture("vroughness", .1f);
00070 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00071 return new Substrate(Kd, Ks, uroughness, vroughness, bumpMap);
00072 }