提交 a00d43ba 编写于 作者: M Matt Pharr

Add optional tint to dielectric material/BxDF

上级 9d2ec6ee
......@@ -88,8 +88,8 @@ SampledSpectrum DielectricInterfaceBxDF::f(Vector3f wo, Vector3f wi,
return SampledSpectrum(0.);
wh = Normalize(wh);
Float F = FrDielectric(Dot(wi, FaceForward(wh, Vector3f(0, 0, 1))), eta);
return SampledSpectrum(mfDistrib.D(wh) * mfDistrib.G(wo, wi) * F /
(4 * cosTheta_i * cosTheta_o));
return tint * SampledSpectrum(mfDistrib.D(wh) * mfDistrib.G(wo, wi) * F /
(4 * cosTheta_i * cosTheta_o));
} else {
// Compute transmission at non-delta dielectric interface
......@@ -112,7 +112,8 @@ SampledSpectrum DielectricInterfaceBxDF::f(Vector3f wo, Vector3f wi,
Float F = FrDielectric(Dot(wo, wh), eta);
Float sqrtDenom = Dot(wo, wh) + etap * Dot(wi, wh);
Float factor = (mode == TransportMode::Radiance) ? Sqr(1 / etap) : 1;
return SampledSpectrum((1 - F) * factor *
return tint *
SampledSpectrum((1 - F) * factor *
std::abs(mfDistrib.D(wh) * mfDistrib.G(wo, wi) *
AbsDot(wi, wh) * AbsDot(wo, wh) /
(cosTheta_i * cosTheta_o * Sqr(sqrtDenom))));
......@@ -137,7 +138,7 @@ pstd::optional<BSDFSample> DielectricInterfaceBxDF::Sample_f(
if (uc < pr / (pr + pt)) {
// Sample perfect specular reflection at interface
Vector3f wi(-wo.x, -wo.y, wo.z);
SampledSpectrum fr(R / AbsCosTheta(wi));
SampledSpectrum fr(tint * R / AbsCosTheta(wi));
return BSDFSample(fr, wi, pr / (pr + pt), BxDFFlags::SpecularReflection);
} else {
......@@ -153,7 +154,7 @@ pstd::optional<BSDFSample> DielectricInterfaceBxDF::Sample_f(
if (tir)
return {};
SampledSpectrum ft(T / AbsCosTheta(wi));
SampledSpectrum ft(tint * T / AbsCosTheta(wi));
// Account for non-symmetry with transmission to different medium
if (mode == TransportMode::Radiance)
ft /= Sqr(etap);
......@@ -285,8 +286,8 @@ Float DielectricInterfaceBxDF::PDF(Vector3f wo, Vector3f wi, TransportMode mode,
}
std::string DielectricInterfaceBxDF::ToString() const {
return StringPrintf("[ DielectricInterfaceBxDF eta: %f mfDistrib: %s ]", eta,
mfDistrib.ToString());
return StringPrintf("[ DielectricInterfaceBxDF eta: %f mfDistrib: %s tint: %s ]", eta,
mfDistrib.ToString(), tint);
}
std::string ThinDielectricBxDF::ToString() const {
......
......@@ -197,8 +197,9 @@ class DielectricInterfaceBxDF {
// DielectricInterfaceBxDF Public Methods
DielectricInterfaceBxDF() = default;
PBRT_CPU_GPU
DielectricInterfaceBxDF(Float eta, const TrowbridgeReitzDistribution &mfDistrib)
: eta(eta == 1 ? 1.001 : eta), mfDistrib(mfDistrib) {}
DielectricInterfaceBxDF(Float eta, SampledSpectrum tint,
const TrowbridgeReitzDistribution &mfDistrib)
: eta(eta == 1 ? 1.001 : eta), tint(tint), mfDistrib(mfDistrib) {}
PBRT_CPU_GPU
BxDFFlags Flags() const {
......@@ -229,6 +230,7 @@ class DielectricInterfaceBxDF {
private:
// DielectricInterfaceBxDF Private Members
Float eta;
SampledSpectrum tint;
TrowbridgeReitzDistribution mfDistrib;
};
......@@ -266,7 +268,7 @@ class ThinDielectricBxDF {
return {};
if (uc < pr / (pr + pt)) {
// Sample perfect specular reflection at interface
// Sample perfect specular reflection at thin dielectric interface
Vector3f wi(-wo.x, -wo.y, wo.z);
SampledSpectrum fr(R / AbsCosTheta(wi));
return BSDFSample(fr, wi, pr / (pr + pt), BxDFFlags::SpecularReflection);
......
......@@ -30,8 +30,8 @@ namespace pbrt {
std::string DielectricMaterial::ToString() const {
return StringPrintf("[ DielectricMaterial displacement: %s uRoughness: %s "
"vRoughness: %s etaF: %s "
"etaS: %s remapRoughness: %s ]",
displacement, uRoughness, vRoughness, etaF, etaS,
"etaS: %s tint: %s remapRoughness: %s ]",
displacement, uRoughness, vRoughness, etaF, etaS, tint,
remapRoughness);
}
......@@ -60,8 +60,11 @@ DielectricMaterial *DielectricMaterial::Create(
parameters.GetFloatTextureOrNull("displacement", alloc);
bool remapRoughness = parameters.GetOneBool("remaproughness", true);
SpectrumTextureHandle tint =
parameters.GetSpectrumTextureOrNull("tint", SpectrumType::Albedo, alloc);
return alloc.new_object<DielectricMaterial>(uRoughness, vRoughness, etaF, etaS,
displacement, normalMap, remapRoughness);
displacement, normalMap, tint,
remapRoughness);
}
// ThinDielectricMaterial Method Definitions
......
......@@ -142,13 +142,14 @@ class DielectricMaterial {
DielectricMaterial(FloatTextureHandle uRoughness, FloatTextureHandle vRoughness,
FloatTextureHandle etaF, SpectrumTextureHandle etaS,
FloatTextureHandle displacement, Image *normalMap,
bool remapRoughness)
SpectrumTextureHandle tint, bool remapRoughness)
: displacement(displacement),
normalMap(normalMap),
uRoughness(uRoughness),
vRoughness(vRoughness),
etaF(etaF),
etaS(etaS),
tint(tint),
remapRoughness(remapRoughness) {
CHECK((bool)etaF ^ (bool)etaS);
}
......@@ -157,7 +158,7 @@ class DielectricMaterial {
template <typename TextureEvaluator>
PBRT_CPU_GPU bool CanEvaluateTextures(TextureEvaluator texEval) const {
return texEval.CanEvaluate({etaF, uRoughness, vRoughness}, {etaS});
return texEval.CanEvaluate({etaF, uRoughness, vRoughness}, {etaS, tint});
}
PBRT_CPU_GPU
......@@ -200,7 +201,8 @@ class DielectricMaterial {
TrowbridgeReitzDistribution distrib(urough, vrough);
// Return BSDF for dielectric material
*bxdf = DielectricInterfaceBxDF(eta, distrib);
SampledSpectrum t = tint ? texEval(tint, ctx, lambda) : SampledSpectrum(1.f);
*bxdf = DielectricInterfaceBxDF(eta, t, distrib);
return BSDF(ctx.wo, ctx.n, ctx.ns, ctx.dpdus, bxdf);
}
......@@ -210,6 +212,7 @@ class DielectricMaterial {
Image *normalMap;
FloatTextureHandle uRoughness, vRoughness, etaF;
SpectrumTextureHandle etaS;
SpectrumTextureHandle tint;
bool remapRoughness;
};
......@@ -629,7 +632,7 @@ class CoatedDiffuseMaterial {
Float gg = Clamp(texEval(g, ctx), -1, 1);
*bxdf =
CoatedDiffuseBxDF(DielectricInterfaceBxDF(e, distrib),
CoatedDiffuseBxDF(DielectricInterfaceBxDF(e, SampledSpectrum(1.f), distrib),
IdealDiffuseBxDF(r), thick, a, gg, config);
return BSDF(ctx.wo, ctx.n, ctx.ns, ctx.dpdus, bxdf);
}
......@@ -731,7 +734,7 @@ class CoatedConductorMaterial {
Float gg = Clamp(texEval(g, ctx), -1, 1);
*bxdf = CoatedConductorBxDF(
DielectricInterfaceBxDF(ieta, interfaceDistrib),
DielectricInterfaceBxDF(ieta, SampledSpectrum(1.f), interfaceDistrib),
ConductorBxDF(conductorDistrib, ce, ck), thick, a, gg, config);
return BSDF(ctx.wo, ctx.n, ctx.ns, ctx.dpdus, bxdf);
}
......@@ -817,7 +820,7 @@ class SubsurfaceMaterial {
TrowbridgeReitzDistribution distrib(urough, vrough);
// Initialize _bsdf_ for smooth or rough dielectric
*bxdf = DielectricInterfaceBxDF(eta, distrib);
*bxdf = DielectricInterfaceBxDF(eta, SampledSpectrum(1.f), distrib);
return BSDF(ctx.wo, ctx.n, ctx.ns, ctx.dpdus, bxdf);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册