예제 #1
0
        public override Vector3 Shade(ShadeRec sr)
        {
            Vector3 L             = base.Shade(sr);
            Vector3 wo            = -sr.Ray.Direction;
            Vector3 wi            = Vector3.Zero();
            Vector3 fr            = reflective_brdf.Sample_F(sr, wo, ref wi);
            Ray     reflected_ray = new Ray(sr.HitPoint, wi);

            reflected_ray.Depth = sr.Depth + 1;
            L += fr * sr.World.Tracer.TraceRay(reflected_ray, sr.Depth + 1) * Vector3.Dot(sr.Normal, wi);
            return(L);
        }
        public override Vector3 Shade(ShadeRec sr)
        {
            Vector3 L             = base.Shade(sr);
            Vector3 wo            = -sr.Ray.Direction;
            Vector3 wi            = Vector3.Zero();
            Vector3 fr            = reflective.Sample_F(sr, wo, ref wi);
            Ray     reflected_ray = new Ray(sr.HitPoint, wi);

            if (specular_btdf.TIR(sr))
            {
                L += sr.World.Tracer.TraceRay(reflected_ray, sr.Depth + 1);
            }
            else
            {
                Vector3 wt = Vector3.Zero();
                Vector3 ft = specular_btdf.Sample_F(sr, wo, ref wt);
                Ray     transmitted_ray = new Ray(sr.HitPoint, wt);
                L += fr * sr.World.Tracer.TraceRay(reflected_ray, sr.Depth + 1) * Vector3.AbsDot(sr.Normal, wi);
                L += ft * sr.World.Tracer.TraceRay(transmitted_ray, sr.Depth + 1) * Vector3.AbsDot(sr.Normal, wt);              //this is very important for transparent rendering
            }
            return(L);
        }