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

Use FastExp() more

上级 32a96243
......@@ -57,19 +57,18 @@ Float BeamDiffusionMS(Float sigma_s, Float sigma_a, Float g, Float eta, Float r)
Float dr = std::sqrt(r * r + zr * zr), dv = std::sqrt(r * r + zv * zv);
// Compute dipole fluence rate $\dipole(r)$ using Equation
// $(\ref{eq:diffusion-dipole})$
Float phiD = Inv4Pi / D_g *
(std::exp(-sigma_tr * dr) / dr - std::exp(-sigma_tr * dv) / dv);
Float phiD =
Inv4Pi / D_g * (FastExp(-sigma_tr * dr) / dr - FastExp(-sigma_tr * dv) / dv);
// Compute dipole vector irradiance $-\N{}\cdot\dipoleE(r)$ using Equation
// $(\ref{eq:diffusion-dipole-vector-irradiance-normal})$
Float EDn =
Inv4Pi *
(zr * (1 + sigma_tr * dr) * std::exp(-sigma_tr * dr) / (dr * dr * dr) -
zv * (1 + sigma_tr * dv) * std::exp(-sigma_tr * dv) / (dv * dv * dv));
Float EDn = Inv4Pi *
(zr * (1 + sigma_tr * dr) * FastExp(-sigma_tr * dr) / (dr * dr * dr) -
zv * (1 + sigma_tr * dv) * FastExp(-sigma_tr * dv) / (dv * dv * dv));
// Add contribution from dipole for depth $\depthreal$ to _Ed_
Float E = phiD * cPhi + EDn * cE;
Float kappa = 1 - std::exp(-2 * sigmap_t * (dr + zr));
Float kappa = 1 - FastExp(-2 * sigmap_t * (dr + zr));
Ed += kappa * rhop * rhop * E;
}
return Ed / nSamples;
......@@ -90,7 +89,7 @@ Float BeamDiffusionSS(Float sigma_s, Float sigma_a, Float g, Float eta, Float r)
Float cosTheta_o = ti / d;
// Add contribution of single scattering at depth $t$
Ess += rho * std::exp(-sigma_t * (d + tCrit)) / (d * d) *
Ess += rho * FastExp(-sigma_t * (d + tCrit)) / (d * d) *
HenyeyGreenstein(cosTheta_o, g) * (1 - FrDielectric(-cosTheta_o, eta)) *
std::abs(cosTheta_o);
}
......@@ -106,8 +105,8 @@ void ComputeBeamDiffusionBSSRDF(Float g, Float eta, BSSRDFTable *t) {
// Choose albedo values of the diffusion profile discretization
for (int i = 0; i < t->rhoSamples.size(); ++i)
t->rhoSamples[i] = (1 - std::exp(-8 * i / (Float)(t->rhoSamples.size() - 1))) /
(1 - std::exp(-8));
t->rhoSamples[i] =
(1 - FastExp(-8 * i / (Float)(t->rhoSamples.size() - 1))) / (1 - FastExp(-8));
ParallelFor(0, t->rhoSamples.size(), [&](int i) {
// Compute the diffusion profile for the _i_th albedo sample
......
......@@ -455,7 +455,7 @@ pstd::optional<BSDFSample> HairBxDF::Sample_f(Vector3f wo, Float uc, Point2f u,
// Sample $M_p$ to compute $\thetai$
Float cosTheta = 1 + v[p] * std::log(std::max<Float>(u[0], 1e-5) +
(1 - u[0]) * std::exp(-2 / v[p]));
(1 - u[0]) * FastExp(-2 / v[p]));
Float sinTheta = SafeSqrt(1 - Sqr(cosTheta));
Float cosPhi = std::cos(2 * Pi * u[1]);
Float sinTheta_i = -cosTheta * sinThetap_o + sinTheta * cosPhi * cosThetap_o;
......
......@@ -923,7 +923,7 @@ class LayeredBxDF {
static Float Tr(Float dz, const Vector3f &w) {
if (std::abs(dz) <= std::numeric_limits<Float>::min())
return 1;
return std::exp(-std::abs(dz / w.z));
return FastExp(-std::abs(dz / w.z));
}
// LayeredBxDF Protected Members
......@@ -1000,9 +1000,9 @@ class HairBxDF {
Float sinTheta_o, Float v) {
Float a = cosTheta_i * cosTheta_o / v;
Float b = sinTheta_i * sinTheta_o / v;
Float mp =
(v <= .1) ? (std::exp(LogI0(a) - b - 1 / v + 0.6931f + std::log(1 / (2 * v))))
: (std::exp(-b) * I0(a)) / (std::sinh(1 / v) * 2 * v);
Float mp = (v <= .1)
? (FastExp(LogI0(a) - b - 1 / v + 0.6931f + std::log(1 / (2 * v))))
: (FastExp(-b) * I0(a)) / (std::sinh(1 / v) * 2 * v);
CHECK(!IsInf(mp) && !IsNaN(mp));
return mp;
}
......
......@@ -72,7 +72,7 @@ PBRT_CPU_GPU inline Float Blackbody(Float lambda, Float T) {
const Float kb = 1.3806488e-23;
// Return emitted radiance for blackbody at wavelength _lambda[i]_
Float l = lambda * 1e-9f;
Float Le = (2 * h * c * c) / (Pow<5>(l) * (std::exp((h * c) / (l * kb * T)) - 1));
Float Le = (2 * h * c * c) / (Pow<5>(l) * (FastExp((h * c) / (l * kb * T)) - 1));
CHECK(!IsNaN(Le));
return Le;
}
......
......@@ -41,7 +41,7 @@ TEST(Spectrum, Blackbody) {
// consistent with this.
for (Float T : {2700, 3000, 4500, 5600, 6000}) {
Float lambdaMax = 2.8977721e-3 / T * 1e9;
Float lambda[3] = {Float(.999 * lambdaMax), lambdaMax, Float(1.001 * lambdaMax)};
Float lambda[3] = {Float(.99 * lambdaMax), lambdaMax, Float(1.01 * lambdaMax)};
EXPECT_LT(Blackbody(lambda[0], T), Blackbody(lambda[1], T));
EXPECT_GT(Blackbody(lambda[1], T), Blackbody(lambda[2], T));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册