Пример #1
0
        public float Evaluate(float cosi)
        {
            cosi = LR.Clamp(cosi, -1.0f, 1.0f);

            // Compute indices of refraction for dielectric
            bool  entering = cosi > 0.0;//>0 入射
            float ei = eta_i, et = eta_t;

            if (!entering)
            {
                LR.Swap(ei, et);
            }

            // Compute _sint_ using Snell's law

            float sint = ei / et * (float)Math.Sqrt(Math.Max(0.0f, 1.0f - cosi * cosi));//处理溢出?

            if (sint >= 1.0)
            {
                // Handle total internal reflection
                return(1.0f);
            }
            else
            {
                float cost = (float)Math.Sqrt(Math.Max(0.0f, 1.0f - sint * sint));
                return(BSDFFunction.FrDiel(Math.Abs(cosi), cost, ei, et));
            }
        }
Пример #2
0
 public float Evaluate(float cosi)
 {
     return(BSDFFunction.FrCond(cosi, eta, k));
 }
Пример #3
0
 override public Spectrum rho(Vector w, int nSamples, float samples)
 {
     return(brdf.rho(BSDFFunction.otherHemisphere(w), nSamples, samples));
 }
Пример #4
0
 override public Spectrum f(Vector wo, Vector wi)
 {
     return(brdf.f(wo, BSDFFunction.otherHemisphere(wi)));
 }
Пример #5
0
 override public Spectrum Sample_f(Vector wo, Vector wi, float u1, float u2, float pdf)
 {
     Spectrum f = brdf.Sample_f(wo, wi, u1, u2, pdf); wi = BSDFFunction.otherHemisphere(wi); return(new Spectrum());
 }