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/kdsubsurface.h"
00028 #include "textures/constant.h"
00029 #include "volume.h"
00030 #include "spectrum.h"
00031 #include "reflection.h"
00032 #include "texture.h"
00033 #include "paramset.h"
00034
00035
00036 BSDF *KdSubsurfaceMaterial::GetBSDF(const DifferentialGeometry &dgGeom,
00037 const DifferentialGeometry &dgShading,
00038 MemoryArena &arena) const {
00039
00040 DifferentialGeometry dgs;
00041 if (bumpMap)
00042 Bump(bumpMap, dgGeom, dgShading, &dgs);
00043 else
00044 dgs = dgShading;
00045 BSDF *bsdf = BSDF_ALLOC(arena, BSDF)(dgs, dgGeom.nn);
00046 Spectrum R = Kr->Evaluate(dgs).Clamp();
00047 float e = eta->Evaluate(dgs);
00048 if (!R.IsBlack())
00049 bsdf->Add(BSDF_ALLOC(arena, SpecularReflection)(R,
00050 BSDF_ALLOC(arena, FresnelDielectric)(1., e)));
00051 return bsdf;
00052 }
00053
00054
00055 BSSRDF *KdSubsurfaceMaterial::GetBSSRDF(const DifferentialGeometry &dgGeom,
00056 const DifferentialGeometry &dgShading,
00057 MemoryArena &arena) const {
00058 float e = eta->Evaluate(dgShading);
00059 float mfp = meanfreepath->Evaluate(dgShading);
00060 Spectrum kd = Kd->Evaluate(dgShading).Clamp();
00061 Spectrum sigma_a, sigma_prime_s;
00062 SubsurfaceFromDiffuse(kd, mfp, e, &sigma_a, &sigma_prime_s);
00063 return BSDF_ALLOC(arena, BSSRDF)(sigma_a, sigma_prime_s, e);
00064 }
00065
00066
00067 KdSubsurfaceMaterial *CreateKdSubsurfaceMaterial(const Transform &xform,
00068 const TextureParams &mp) {
00069 float Kd[3] = { .5, .5, .5 };
00070 Reference<Texture<Spectrum> > kd = mp.GetSpectrumTexture("Kd", Spectrum::FromRGB(Kd));
00071 Reference<Texture<float> > mfp = mp.GetFloatTexture("meanfreepath", 1.f);
00072 Reference<Texture<float> > ior = mp.GetFloatTexture("index", 1.3f);
00073 Reference<Texture<Spectrum> > kr = mp.GetSpectrumTexture("Kr", Spectrum(1.f));
00074 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00075 return new KdSubsurfaceMaterial(kd, kr, mfp, ior, bumpMap);
00076 }
00077
00078