static float RdToAlphap(float reflectance, float A) { float alphaLow = 0., alphaHigh = 1.f; float kd0 = RdIntegral(alphaLow, A); float kd1 = RdIntegral(alphaHigh, A); for (int i = 0; i < 16; ++i) { Assert(kd0 <= reflectance && kd1 >= reflectance); float alphaMid = (alphaLow + alphaHigh) * 0.5f; float kd = RdIntegral(alphaMid, A); if (kd < reflectance) { alphaLow = alphaMid; kd0 = kd; } else { alphaHigh = alphaMid; kd1 = kd; } } return (alphaLow + alphaHigh) * 0.5f; }
static double RdToAlphap(double reflectance, double A) { double alphaLow = 0., alphaHigh = 1.f; double kd0 = RdIntegral(alphaLow, A); double kd1 = RdIntegral(alphaHigh, A); UNUSED(kd0); UNUSED(kd1); for (int i = 0; i < 16; ++i) { photonflowAssert(kd0 <= reflectance && kd1 >= reflectance); double alphaMid = (alphaLow + alphaHigh) * 0.5f; double kd = RdIntegral(alphaMid, A); if (kd < reflectance) { alphaLow = alphaMid; kd0 = kd; } else { alphaHigh = alphaMid; kd1 = kd; } } return (alphaLow + alphaHigh) * 0.5f; }