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
00026 #include "stdafx.h"
00027 #include "materials/substrate.h"
00028 #include "spectrum.h"
00029 #include "reflection.h"
00030 #include "paramset.h"
00031 #include "texture.h"
00032
00033
00034 BSDF *SubstrateMaterial::GetBSDF(const DifferentialGeometry &dgGeom, const DifferentialGeometry &dgShading, MemoryArena &arena) const {
00035
00036 DifferentialGeometry dgs;
00037 if (bumpMap)
00038 Bump(bumpMap, dgGeom, dgShading, &dgs);
00039 else
00040 dgs = dgShading;
00041 BSDF *bsdf = BSDF_ALLOC(arena, BSDF)(dgs, dgGeom.nn);
00042 Spectrum d = Kd->Evaluate(dgs).Clamp();
00043 Spectrum s = Ks->Evaluate(dgs).Clamp();
00044 float u = nu->Evaluate(dgs);
00045 float v = nv->Evaluate(dgs);
00046
00047 bsdf->Add(BSDF_ALLOC(arena, FresnelBlend)(d, s, BSDF_ALLOC(arena, Anisotropic)(1.f/u, 1.f/v)));
00048 return bsdf;
00049 }
00050
00051
00052 SubstrateMaterial *CreateSubstrateMaterial(const Transform &xform,
00053 const TextureParams &mp) {
00054 Reference<Texture<Spectrum> > Kd = mp.GetSpectrumTexture("Kd", Spectrum(.5f));
00055 Reference<Texture<Spectrum> > Ks = mp.GetSpectrumTexture("Ks", Spectrum(.5f));
00056 Reference<Texture<float> > uroughness = mp.GetFloatTexture("uroughness", .1f);
00057 Reference<Texture<float> > vroughness = mp.GetFloatTexture("vroughness", .1f);
00058 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00059 return new SubstrateMaterial(Kd, Ks, uroughness, vroughness, bumpMap);
00060 }
00061
00062