diff --git a/src/core/paramset.cpp b/src/core/paramset.cpp index deed91f914..50a21dda48 100644 --- a/src/core/paramset.cpp +++ b/src/core/paramset.cpp @@ -151,7 +151,7 @@ void ParamSet::AddBlackbodySpectrum(const std::string &name, void ParamSet::AddSampledSpectrum(const std::string &name, std::unique_ptr values, - int nValues) { + int nValues, SpectrumType spectrumType) { EraseSpectrum(name); CHECK_EQ(nValues % 2, 0); nValues /= 2; @@ -162,14 +162,15 @@ void ParamSet::AddSampledSpectrum(const std::string &name, v[i] = values[2 * i + 1]; } std::unique_ptr s(new Spectrum[1]); - s[0] = Spectrum::FromSampled(wl.get(), v.get(), nValues); + s[0] = Spectrum::FromSampled(wl.get(), v.get(), nValues, spectrumType); std::shared_ptr> psi( new ParamSetItem(name, std::move(s), 1)); spectra.push_back(psi); } void ParamSet::AddSampledSpectrumFiles(const std::string &name, - const char **names, int nValues) { + const char **names, int nValues, + SpectrumType spectrumType) { EraseSpectrum(name); std::unique_ptr s(new Spectrum[nValues]); for (int i = 0; i < nValues; ++i) { @@ -197,7 +198,7 @@ void ParamSet::AddSampledSpectrumFiles(const std::string &name, wls.push_back(vals[2 * j]); v.push_back(vals[2 * j + 1]); } - s[i] = Spectrum::FromSampled(&wls[0], &v[0], wls.size()); + s[i] = Spectrum::FromSampled(&wls[0], &v[0], wls.size(), spectrumType); } cachedSpectra[fn] = s[i]; } diff --git a/src/core/paramset.h b/src/core/paramset.h index 1f995e7a16..8dc4602496 100644 --- a/src/core/paramset.h +++ b/src/core/paramset.h @@ -78,9 +78,9 @@ class ParamSet { void AddBlackbodySpectrum(const std::string &, std::unique_ptr v, int nValues); void AddSampledSpectrumFiles(const std::string &, const char **, - int nValues); + int nValues, SpectrumType spectrumType); void AddSampledSpectrum(const std::string &, std::unique_ptr v, - int nValues); + int nValues, SpectrumType spectrumType); bool EraseInt(const std::string &); bool EraseBool(const std::string &); bool EraseFloat(const std::string &); diff --git a/src/core/parser.cpp b/src/core/parser.cpp index 5266c5ae45..1ed0cd2d53 100644 --- a/src/core/parser.cpp +++ b/src/core/parser.cpp @@ -674,7 +674,8 @@ static void AddParam(ParamSet &ps, const ParamListItem &item, ps.AddBlackbodySpectrum(name, std::move(floats), nItems); } else if (type == PARAM_TYPE_SPECTRUM) { if (item.stringValues) { - ps.AddSampledSpectrumFiles(name, item.stringValues, nItems); + ps.AddSampledSpectrumFiles(name, item.stringValues, nItems, + spectrumType); } else { if ((nItems % 2) != 0) { Warning( @@ -687,7 +688,8 @@ static void AddParam(ParamSet &ps, const ParamListItem &item, std::unique_ptr floats(new Float[nItems]); for (int j = 0; j < nItems; ++j) floats[j] = item.doubleValues[j]; - ps.AddSampledSpectrum(name, std::move(floats), nItems); + ps.AddSampledSpectrum(name, std::move(floats), nItems, + spectrumType); } } else if (type == PARAM_TYPE_STRING) { std::unique_ptr strings(new std::string[nItems]); diff --git a/src/core/spectrum.h b/src/core/spectrum.h index 35107cf7f9..d8a1f80188 100644 --- a/src/core/spectrum.h +++ b/src/core/spectrum.h @@ -292,14 +292,14 @@ class SampledSpectrum : public CoefficientSpectrum { SampledSpectrum(Float v = 0.f) : CoefficientSpectrum(v) {} SampledSpectrum(const CoefficientSpectrum &v) : CoefficientSpectrum(v) {} - static SampledSpectrum FromSampled(const Float *lambda, const Float *v, - int n) { + static SampledSpectrum FromSampled(const Float *lambda, const Float *v, + int n, SpectrumType type = SpectrumType::Illuminant) { // Sort samples if unordered, use sorted for returned spectrum if (!SpectrumSamplesSorted(lambda, v, n)) { std::vector slambda(&lambda[0], &lambda[n]); std::vector sv(&v[0], &v[n]); SortSpectrumSamples(&slambda[0], &sv[0], n); - return FromSampled(&slambda[0], &sv[0], n); + return FromSampled(&slambda[0], &sv[0], n, type); } SampledSpectrum r; for (int i = 0; i < nSpectralSamples; ++i) { @@ -463,13 +463,14 @@ class RGBSpectrum : public CoefficientSpectrum<3> { const Float YWeight[3] = {0.212671f, 0.715160f, 0.072169f}; return YWeight[0] * c[0] + YWeight[1] * c[1] + YWeight[2] * c[2]; } - static RGBSpectrum FromSampled(const Float *lambda, const Float *v, int n) { + static RGBSpectrum FromSampled(const Float *lambda, const Float *v, int n, + SpectrumType type = SpectrumType::Illuminant) { // Sort samples if unordered, use sorted for returned spectrum if (!SpectrumSamplesSorted(lambda, v, n)) { std::vector slambda(&lambda[0], &lambda[n]); std::vector sv(&v[0], &v[n]); SortSpectrumSamples(&slambda[0], &sv[0], n); - return FromSampled(&slambda[0], &sv[0], n); + return FromSampled(&slambda[0], &sv[0], n, type); } Float xyz[3] = {0, 0, 0}; for (int i = 0; i < nCIESamples; ++i) { @@ -483,6 +484,11 @@ class RGBSpectrum : public CoefficientSpectrum<3> { xyz[0] *= scale; xyz[1] *= scale; xyz[2] *= scale; + // Apply D65 white point for reflectance + if (type == SpectrumType::Reflectance) { + xyz[0] *= 0.950470f; + xyz[2] *= 1.088827f; + } return FromXYZ(xyz); } }; diff --git a/src/materials/metal.cpp b/src/materials/metal.cpp index e034f3b045..0dc6484287 100644 --- a/src/materials/metal.cpp +++ b/src/materials/metal.cpp @@ -114,11 +114,13 @@ const Float CopperK[CopperSamples] = { MetalMaterial *CreateMetalMaterial(const TextureParams &mp) { static Spectrum copperN = - Spectrum::FromSampled(CopperWavelengths, CopperN, CopperSamples); + Spectrum::FromSampled(CopperWavelengths, CopperN, CopperSamples, + SpectrumType::Reflectance); std::shared_ptr> eta = mp.GetSpectrumTexture("eta", copperN); static Spectrum copperK = - Spectrum::FromSampled(CopperWavelengths, CopperK, CopperSamples); + Spectrum::FromSampled(CopperWavelengths, CopperK, CopperSamples, + SpectrumType::Reflectance); std::shared_ptr> k = mp.GetSpectrumTexture("k", copperK); std::shared_ptr> roughness = mp.GetFloatTexture("roughness", .01f);