Exemplo n.º 1
0
        /// <summary>
        /// Sample returns a single possible direction
        /// </summary>
        /// <param name="woL"></param>
        /// <returns></returns>
        public override (Spectrum, Vector3, double) Sample_f(Vector3 wo)
        {
            var F = fresnel.Evaluate(Utils.CosTheta(wo));

            bool entering = Utils.CosTheta(wo) > 0;
            var  etaI     = entering ? fresnel.EtaI : fresnel.EtaT;
            var  etaT     = entering ? fresnel.EtaT : fresnel.EtaI;

            var n = new Vector3(0, 0, 1);

            n = Vector3.Dot(n, wo) < 0 ? -n : n;

            var(refracted, wt) = Refract(wo, n, etaI / etaT);

            if (!refracted)
            {
                return(Spectrum.ZeroSpectrum, null, 0);
            }

            Spectrum ft = r * (1 - F.Max());

            var pdf = 1 - F.Max();

            return(ft / Utils.AbsCosTheta(wt), wt, pdf);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Sample returns a single possible direction
        /// </summary>
        /// <param name="woL"></param>
        /// <returns></returns>
        public override (Spectrum, Vector3, double) Sample_f(Vector3 woL)
        {
            // perfect specular reflection
            Vector3  wiL = new Vector3(-woL.x, -woL.y, woL.z);
            Spectrum ft  = r * fresnel.Evaluate(Utils.CosTheta(wiL));

            return(ft / Utils.AbsCosTheta(wiL), wiL, 1);
        }