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/uber.h"
00028 #include "spectrum.h"
00029 #include "reflection.h"
00030 #include "texture.h"
00031 #include "paramset.h"
00032
00033
00034 BSDF *UberMaterial::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
00043 Spectrum op = opacity->Evaluate(dgs).Clamp();
00044 if (op != Spectrum(1.)) {
00045 BxDF *tr = BSDF_ALLOC(arena, SpecularTransmission)(-op + Spectrum(1.), 1., 1.);
00046 bsdf->Add(tr);
00047 }
00048
00049 Spectrum kd = op * Kd->Evaluate(dgs).Clamp();
00050 if (!kd.IsBlack()) {
00051 BxDF *diff = BSDF_ALLOC(arena, Lambertian)(kd);
00052 bsdf->Add(diff);
00053 }
00054
00055 float e = eta->Evaluate(dgs);
00056 Spectrum ks = op * Ks->Evaluate(dgs).Clamp();
00057 if (!ks.IsBlack()) {
00058 Fresnel *fresnel = BSDF_ALLOC(arena, FresnelDielectric)(e, 1.f);
00059 float rough = roughness->Evaluate(dgs);
00060 BxDF *spec = BSDF_ALLOC(arena, Microfacet)(ks, fresnel, BSDF_ALLOC(arena, Blinn)(1.f / rough));
00061 bsdf->Add(spec);
00062 }
00063
00064 Spectrum kr = op * Kr->Evaluate(dgs).Clamp();
00065 if (!kr.IsBlack()) {
00066 Fresnel *fresnel = BSDF_ALLOC(arena, FresnelDielectric)(e, 1.f);
00067 bsdf->Add(BSDF_ALLOC(arena, SpecularReflection)(kr, fresnel));
00068 }
00069
00070 return bsdf;
00071 }
00072
00073
00074 UberMaterial *CreateUberMaterial(const Transform &xform,
00075 const TextureParams &mp) {
00076 Reference<Texture<Spectrum> > Kd = mp.GetSpectrumTexture("Kd", Spectrum(0.25f));
00077 Reference<Texture<Spectrum> > Ks = mp.GetSpectrumTexture("Ks", Spectrum(0.25f));
00078 Reference<Texture<Spectrum> > Kr = mp.GetSpectrumTexture("Kr", Spectrum(0.f));
00079 Reference<Texture<float> > roughness = mp.GetFloatTexture("roughness", .1f);
00080 Reference<Texture<float> > eta = mp.GetFloatTexture("index", 1.5f);
00081 Reference<Texture<Spectrum> > opacity = mp.GetSpectrumTexture("opacity", 1.f);
00082 Reference<Texture<float> > bumpMap = mp.GetFloatTexture("bumpmap", 0.f);
00083 return new UberMaterial(Kd, Ks, Kr, roughness, opacity, eta, bumpMap);
00084 }
00085
00086