void SubsurfaceFromDiffuse(const Spectrum &Kd, float meanPathLength, float eta, Spectrum *sigma_a, Spectrum *sigma_prime_s) { float A = (1.f + Fdr(eta)) / (1.f - Fdr(eta)); float rgb[3]; Kd.ToRGB(rgb); float sigma_prime_s_rgb[3], sigma_a_rgb[3]; for (int i = 0; i < 3; ++i) { float alphap = RdToAlphap(rgb[i], A); float sigma_tr = 1.f / meanPathLength; float sigma_prime_t = sigma_tr / sqrtf(3.f * 1.f - alphap); sigma_prime_s_rgb[i] = alphap * sigma_prime_t; sigma_a_rgb[i] = sigma_prime_t - sigma_prime_s_rgb[i]; } *sigma_a = Spectrum::FromRGB(sigma_a_rgb); *sigma_prime_s = Spectrum::FromRGB(sigma_prime_s_rgb); }
void subsurfaceFromDiffuse(const Spectrum &Kd, double meanPathLength, double eta, Spectrum *sigma_a, Spectrum *sigma_prime_s) { double A = (1.f + Fdr(eta)) / (1.f - Fdr(eta)); double rgb[3]; Kd.toRGB(rgb); double sigma_prime_s_rgb[3], sigma_a_rgb[3]; for (int i = 0; i < 3; ++i) { // Compute $\alpha'$ for RGB component, compute scattering properties double alphap = RdToAlphap(rgb[i], A); double sigma_tr = 1.f / meanPathLength; double sigma_prime_t = sigma_tr / sqrtf(3.f * (1.f - alphap)); sigma_prime_s_rgb[i] = alphap * sigma_prime_t; sigma_a_rgb[i] = sigma_prime_t - sigma_prime_s_rgb[i]; } *sigma_a = Spectrum::fromRGB(sigma_a_rgb); *sigma_prime_s = Spectrum::fromRGB(sigma_prime_s_rgb); }