示例#1
0
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);
}
示例#2
0
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);
}